Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库、缓存和消息代理使用。Redis 支持丰富的数据结构,有:字符串(Strings)、哈希(Hashs)、列表(Lists)、集合(Sets)、有序集合(SortedSets)。Redis 内置了复制、Lua脚本、事务及不同级别的数据硬盘持久化机制,并提供了高可用的Redis Sentinel和自动分区的集群机制。是构建高性能、可扩展的 Web 应用程序的有效手段。

  1. 安装配置

  2. 数据类型
  3. 键操作
  4. 发布/订阅
  5. 事务
  6. 连接验证

1. 安装配置

1.1 安装

依次执行以下命令,下载、解压、编译、安装Redis:

$ wget http://download.redis.io/releases/redis-3.2.3.tar.gz
$ tar xzf redis-3.2.3.tar.gz
$ cd redis-3.2.3
$ make & make install

安装后,会在/usr/local/bin目录下生成以下几个文件,作用如下:

  • redis-server:Redis服务器端启动程序
  • redis-cli:Redis客户端操作工具。也可以用telnet根据其纯文本协议来操作
  • redis-benchmark:Redis性能测试工具
  • redis-check-aof:数据修复工具
  • redis-check-dump:检查导出工具

1.2 配置

Redis 配置文件在当前目录下,将其复制到/etc/目录下:

$ cp redis.conf /etc/

修改配置文件:

$ vi /etc/redis.conf

修改daemonize yes参数,使Redis可以后台运行:

daemonize yes

1.3 启动服务器

启动Redis:

$ /usr/local/bin/redis-server /etc/redis.conf

可以使用ps命令查看启情况:

$ ps -ef | grep redis

如果看到类型如下输出,则表示启动成功:

root     18443     1  0 13:05 ?        00:00:00 ./redis-server *:6379 

为了使Redis能够开机自动运行,还需要将其加入开机启动项:

echo "/usr/local/bin/redis-server /etc/redis.conf" >>/etc/rc.local

Redis 安装配置的详细介绍请参考:Linux CentOS下安装Redis

1.4 启动客户端

redis-cli是一个Redis 命令行客户端程序,接下来我们使用这个程序进行一操作。启动这个程序:

$ redis-cli

启动后,可通过PING命令检查服务器是否连通:

127.0.0.1:6379> PING
PONG

如果需要连接到一台远程Redids服务器,可以通过添加redis-cli参数指定。

语法结构如下:

$ redis-cli -h host -p port -a password

如,主机127.0.0.1、端口6379上的远程服务器,并添加验证密码password

$ redis-cli -h 127.0.0.1 -p 6379 -a password
127.0.0.1:6379> ping
PONG

2. 数据类型

Redis 支持字符串(Strings)、哈希(Hashs)、列表(Lists)、集合(Sets)、有序集合(SortedSets) 5种数据类型,本节介绍这5种数据类型的特点及使用方法。

2.1 字符串(Strings)

简介

字符串(Strings)是最基本、使用最多的一种数据类型。Redis的字符串是二进制安全的,这意味着你可以使用Redis的字符串存储任何类型的数据,如:JPEG图片或序列化的Ruby 对象等。

一个字符串类型的值最大长度为512 M。

你可以使用Redis 的字符串类型做很多有用事情,如:

  • 字符串类型可以做为原子计数器使用,可使用的方法有:INCRDECRINCRBY
  • 使用APPEND命令向字符串追加内容
  • 使用字符串的GETRANGESETRANGE命令可以做为一个随机存取向量
  • 对很多在很小的空间数据,或创建一个Redis备份可以使用GETBIT 和 SETBIT命令

使用示例

设置与取值

使用SET命令可以设置一个字符串类型的值,多次调会导致已存在key的值被修改。

使用GET可以获取已存在字符串key的值:

redis> set mySite itbilu
OK
redis> set mySite itbilu.com
OK
redis> get mySite
"itbilu.com"

自增、自减

“字符串”类型中不仅可以存字符串值,还可存取整型值/浮点数值。

Redis 提供了INCRDECR等命令,用于整型值的自增、自减等操作。而INCRBYFLOAT可以用于自增一个指定的浮点值:

redis> set myInt 10
OK
redis> incr myInt
(integer) 11
redis> incrby myInt 2
(integer) 13
redis> decr myInt
(integer) 12
redis> decrby myInt 2
(integer) 10
redis> incrbyfloat myInt 1.2
"11.2"

批量操作

字符串类型支持批量操作,使用MSETMSETNX可以批量设置字符串类型的key-valueMSETNX仅当不存在时才会设置。

MGET可以用于获取多个字符串类型的值。

redis> mset domain itbilu.com name IT笔录
OK
redis> mget domain name
1) "itbilu.com"
2) "IT\xe7\xac\x94\xe5\xbd\x95"

字符串类型详细介绍请参考:Redis 字符串(String)类型

2.2 哈希(Hashs)

简介

Redis 哈希(Hashs)是字符串字段和字符串值之间的映射,所以它十分适合用来表示一个对象类型。

哈希在某些应用场景中是一个非常有用存储方式,你可以将数以百万计的对象存储在一个很小的 Redis实例中。

一个Redis 哈希值可存储232-1(40亿)个键-值对。

使用示例

设置与取值

设置哈希类型的值使用HSET,取值使用HGET获取单个哈希属性值,或使用HGETALL获取哈希属性和值:

redis> hset site domain itbilu.com
(integer) 1
redis> hget site domain
"itbilu.com"
redis> hgetall site
1) "domain"
2) "itbilu.com"

批量操作

哈希同样支持批量操作。可以使用HMSET设置多个哈希属性和值,使用HMGET获取多个哈希属性和值:

redis> hmset site domain itbilu.com name IT笔录
OK
redis> hmget site domain name
1) "itbilu.com"
2) "IT\xe7\xac\x94\xe5\xbd\x95"

哈希类型详细介绍请参考:Redis 哈希(Hash)类型

2.3 列表(Lists)

简介

Redis 列表(Lists)是简单的字符串列表,并根据插入顺序进行排序。

你可以使用LPUSH方法向列表的开头插入新元素,或使用RPUSH方法向列表的结尾插入新元素。当于一个空键执行操作时,会创建一个新列表。同样的如果清空列表时,键也将键空间中移除。

一个Redis 列表中最多可存储232-1(40亿)个元素。

从时间复杂度来看,Redis 列表的主要特征是在列表开头和结尾添加或删除元素时,访问时间会非常的快。但如果要访问列表的中间的元素,则会相对缓慢。

我们常对列表做的操作有:

  • 对于一个在社交网络的时间线模型,可使用LPUSH向用户时间线中依次添加新元素,并可以使用LRANGE取出一些最近插入的新元素。
  • 可以使用LPUSH 和 LTRIM 创建一个不超过指定元素的列表,但只存储最近的 N 个元素。
  • 列表可以做为原始消息传递,如Ruby 库Resque就将列表结构做为后台作业。
  • 列表结构还支持多种操作命令,包括阻塞命令BLPOP

使用示例

设置与取值

设置一个列表类型值的方式较多。可以通过LPUSHLRUSH向列表的开头或结尾插入数据,也可以通过LSET对列表中指定索引位的元素进行操作。LSET不允许对不存在的列表进行操作。

列表元素取值要以全用LINDEX获取指定索引位的元素,也可以使用LPOP返回并移除列表头部的元素,或使用RPOP返回并移除列表尾部的元素。

redis> lpush mylist one
(integer) 1
redis> rpush mylist two
(integer) 2
redis> lset mylist 0 1
OK
redis> lindex mylist 0
"1"
redis> lpop mylist
"1"
redis> lindex mylist 0
"two"

2.4 集合(Sets)

简介

Redis 集合(Sets)是一个字符串无序集合,其添加、删除、测试成员的时间都是O(1)(无论元素多少,都是一个恒定时间)

集合中不允许重复成员的存在。当多次添加一个元素时,其结果会设置单个成员多次。这样,我们就可不用检查元素是否存在而直接对元素进行操作。

一个Redis 集合中最多可包含232-1(40亿)个元素。

我们可以对Redis 集合进行的操作有:

  • 利用集合的唯一性,可以将所有唯一IP访问指定向一个博客贴子。这时只需要每次有页面访问时使用SADD 添加记录,就可确保IP的唯一性。
  • Redis 集合很好的表示了关系。你可以使用Redis 创建一个标签系统并使用集合来表示每一个标签。如:可以通过SADD命令,可以把所有对象的标签ID添加到集合中以表示指定的标签;如果希望每个对象可以同时有3个不同的人,可以全用SINTER
  • 通过SPOP 或 SRANDMEMBER 命令,可以随机的提取集合中的元素。

使用示例

设置与取值

集合中的元素具有唯一性,所以我们可以向集合中多次添加同一个值,向集合中插入值使用SADD命令。

获取集合中的元素使用SMEMBERS命令,也可以使用SPOP获取并删除一个随机值。

redis> sadd db MySQL MongoDB Redis
(integer) 3
redis> smembers db
1) "MySQL"
2) "MongoDB"
3) "Redis"
redis> spop db
"Redis"
redis> smembers db
1) "MySQL"
2) "MongoDB"

集合间的操作

Redis 还提供了多个集合间操作的方法,如:可以通过SINTER查询集合间的交集、通过SUNION获取集间的并集,通过SDIFF获取集合间的差集。集合中的元素可以通过SMOVE命令从一个集合移到另一个集中。

redis> sadd db MySQL MongoDB Redis
(integer) 1
redis> sadd sql MySQL MSSQL
(integer) 1
redis> sinter db sql
1) "MySQL"
redis> sunion db sql
1) "MySQL"
2) "MongoDB"
3) "Redis"
4) "MySql"
5) "MSSQL"
redis> sdiff db sql
1) "MongoDB"
2) "Redis"
redis> smove sql MSSQL db
(integer) 0
redis> smembers db
1) "MySQL"
2) "MongoDB"
3) "Redis"

2.5 有序集合(SortedSets)

简介

Redis 有序集合(SortedSets)类似于集合,同样是表示字符串的集合。不同的是,有序集合中的每个元素都通过 score 进行关联,并用于集合的排序。对有序集合进行添加、移除、更新都会非常快,因为其中的元素都是有序的。也可以非常快的通过 score 或位置获取元素的范围。

使用示例

设置与取值

有序集合类似于集合,对有序集合插入值时除了指定插入元素外,还要指定一个score参数,该参数可以认为是一个权重,也可以任何是一个排序的序号。

对于有序集合,可以使用ZADD设置集合元素。

有序集合并没有提供返回全部元素的方法,介可以通过ZRANGE集合指定范围内的元素,也可以通过ZRANK获取指定成员的排名,通过ZSCORE返回元素的权重(score)值。

redis> zadd db 1 MySQL
(integer) 1
redis> zadd db 2 MongoDB 3 Redis
(integer) 2
redis> ZRANGE db 1 2
1) "MongoDB"
2) "Redis"
redis> ZRANK db Redis
(integer) 2
redis> ZSCORE db Redis
"3"

3. 键操作

除数据类型操作外,键操作也是Redis 中基本和非常重要的操作。Redis 提供很多键管理相关方法,如:KEYS键查找、EXPIREAT设置键的过期时间、RENAME对键重命名等。

键查找相关操作

在设置或添加某一类型元素前,一般需要先判断指定的key是否存在。判断键是否存使用EXISTS key命令:

redis> exists dbs
(integer) 0
redis> exists db
(integer) 1

为防止数据类型错误,在设置数据值或向某一类型的key插入数据前进行数据类型的判断,这时可以使用TYPE key命令:

redis> type db
zset

Redis 还提供了一个用于键管理的命令KEYS,该命令可以通过匹配模式在数据库中查找键:

redis> keys d*
1) "domain"
2) "db"

有效期

有效期设置非常有用,我们可以对指定键设置一个生存时间,并在到期自动删除键。

设置一个key有效期,可以使用EXPIREPEXPIRE设置有效期,EXPIRE通过秒数表示有期,而PEXPIRE使用毫秒设置key的有效期;还可以使用EXPIREATPEXPIREAT设置key的到期时间,二者通过一个UNIX 时间戳表示key到期时间,不同的是前者是一个秒级时间戳,后者是一个毫秒级时间戳。

对于设置过有效期的键,我们可以通过TTLPTTL查看键的过期时间,前者使用秒数表示,后者使用毫秒数表示。

设置键的到期时间后,还可以通过PERSIST命令移除到期时间。

redis> set cache itbilu.com
OK
redis> expire cache 120
(integer) 1
redis> ttl cache
(integer) 114
redis> pttl cache
(integer) 110248
redis> persist cache
(integer) 0
redis> ttl cache
(integer) -1

序列化

为了方便网络传输,我们需要将数据库中存储对象进行序列化,或者将收到的数据进行反序列化。在Redis 中可以通过DUMP进行指定key值的序列化,并可以通过RESTORE进行反序列化。

redis> set cache itbilu.com
OK
> dump cache
"\x00\nitbilu.com\x06\x00\xbf\xad\xf4\x86\xca\"\x90\xeb"
redis> restore cache-again 0 "\x00\nitbilu.com\x06\x00\xbf\xad\xf4\x86\xca\"\x90\xeb"
OK
redis> get cache-again
"itbilu.com"

其它操作

当需要对键进行重命名时,可以使用RENAME命令。对于不再需要的键,可以通过DEL命令将期删除。Redis 还支持数据库间的key转移,key转移通过MOVE命名实现。

redis> get cache-again
"itbilu.com"
redis> set cacha itbilu.com
OK
redis> rename cacha cahce
OK
redis> move cache 1
(integer) 1
redis> del cache
(integer) 0

4. 发布/订阅

Redis 实现了通过发布/订阅(pub/sub)实现了类似邮件系统的工作机制,发送者(发布者)可以发送消息,而接收者(用户)能过订阅指定的通道(channel)可以实现消息的接收。Redis 客户端可以订阅任意数量的通道。

发布/订阅是一种消息通信模式,其主要的目的是实现消息发布者和订阅者之间的解耦。Redis 做为一个发布/订阅服务器,可以实现消息订阅者和发布者之间的消息路由功能。

在Redis 中,消息类型会做为通道(channel)。订阅者可以通过SUBSCRIBEPSUBSCRIBE命令订阅自己所需要的消息类型。当发布者通过PUBLISH向Redis 服务器发送特定类型的消息时,订阅该消息的客户端都会收到该消息。一个客户端可以同时是消息的发布者和订阅者,也可以是其中之一。一个客户端可以同时订单多个通道,也可以向多个通道发布消息。

使用示例

启动一个客户端(client1),并使用SUBSCRIBE命名订阅msg事件:

redis> subscribe msg
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "msg"
3) (integer) 1

在另一个客户端(client2)中使用PUBLISH命令向msg通道发送消息:

redis> publish msg "hi, there"
(integer) 1

client1会收到如下消息:

1) "message"
2) "msg"
3) "hi, there"

5. 事务

Redis 支持事务机制,Redis 中的事务是一组在单一步骤中执行的命令。事务有以下两个属性:

  • 在一个事务中,每个命令都是一个独立的操作,并按顺序执行。在事务的执行过程中,Redis 服务器不会处理其它客户端的请求。
  • Redis 事务具有原子性,在一个事务当中的命令要么全部执行成功,要么全部不执行。

Redis 通过MULTI命令标记一个事务的开始,其后输入的所有命令会按照先后顺序被放进一个队列当中,然后通过EXEC命令原子性的执行。

# 启动一个事务
redis> MULTI
OK
# 这里会输入一些需要执行的命令
redis> EXEC # 依次执行前面输入的命令

如,我们可以像下面这样使用Redis 的事务:

redis> multi
OK
redis> set domain itbilu.com
QUEUED
redis> get domain
QUEUED
redis> del domain
QUEUED
redis> exec
1) OK
2) "itbilu.com"
3) (integer) 1

6. 连接验证

AUTH - 身份验证

当连接到一个需要验证的Redis 服务器进,可以在启动客户端时指定连接主机、端口、认证密码等。可以在客户端启动后,通过AUTH命令进行验证。

如,连接到一台本地Redis 服务器,并在连接进行验证:

$ redis-cli
redis> set name "my name"
(error) NOAUTH Authentication required.
redis> auth 21jieyan2015
OK
redis> set name "my name"
OK

PING - 服务器状态检测

PING命令用于检测服务器状态,如果服务器运行正常会响应一个PONG消息:

redis> ping
PONG

SELECT - 数据库切换

SELECT命令用于切换到指定的数据库。Redis 中的数据库使用以0开始的索引号表示,默认为0

如,切换到索引号为1的数据库:

redis> set db_number 0
OK
redis> select 1
OK
redis[1]> get db_number
(nil)
redis[1]> select 0
OK
redis> get db_number
"0"

QUIT - 关闭连接

操作完毕后,我们可以使用QUIT命令请求服务器关闭与当前客户端的连接。一旦所有等待中的回复(如果有)顺利写入到客户端,连接就会被关闭。

redis> quit
$ # 连接已断开

转自:http://itbilu.com/database/redis/4JoBoVuKb.html

Redis 数据库入门指南的更多相关文章

  1. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  2. 超强、超详细Redis数据库入门教程(转载)

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下   [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...

  3. 超详细Redis数据库入门教程

    [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis ...

  4. Redis数据库入门基础,及优缺点介绍

    简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-value数据库.R ...

  5. 【转】redis数据库入门教程(全面详细)+面试问题

    [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis ...

  6. redis数据库入门

    Redis入门(1) 之安装.配置.安全登录 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redi ...

  7. Redis数据库入门教程

    [使用redis客户端] 我们直接看一个例子: 复制代码 代码如下: //这样来启动redis客户端了 $ ./redis-cli //用set指令来设置key.value 127.0.0.1:637 ...

  8. Redis入门指南之三(入门)

    本节主要介绍Redis的5种数据类型,同时使用Python API来操作Redis,其中python版本为3.5, redis版本为4.0.2. redis-py 的API的使用可以分类为: (1)连 ...

  9. Redis入门指南之一(简介)

    1. 简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同的场景下的缓存与存储需求.同时Redis的诸多高级功能使其可以胜任消息队列.任务队列等不同的 ...

随机推荐

  1. nginx服务器命令

    nginx -s reload  :修改配置后重新加载生效 nginx -s reopen  :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是 ...

  2. [UML]UML系列——时序图(顺序图)sequence diagram

    系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图Class [UML]UML系列——类 ...

  3. style,currentStyle,getComputedStyle的区别和用法

    先说说层叠样式表的三种形式(三种的叫法不一,按照各自的习惯): 一.内联样式:在HTML标签用style属性设置.如: 1 <p >这是内联样式</p> 二.嵌入样式:通过&l ...

  4. netlink优势

    netlink相对其他应用进程和内核之间通信的方式(ioctrl或者系统文件等方式),全双工,可由内核发起,应用进程可用epoll监听,而其他方式只能由应用进程发起. 顺便记下隧道,隧道可以通过在ip ...

  5. 转:入门Webpack,看这篇就够了

    写在前面的话 阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过:如果你和十天前的我一样,对很多选项存在着疑惑,那花一段 ...

  6. H5案例分享:JS手势框架 —— Hammer.js

    JS手势框架 -- Hammer.js 一.hammer.js简介 hammerJS是一个开源的,轻量级的触屏设备javascript手势库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件.允许 ...

  7. 数据库操作,jdbc的CRUD

    用Java代码操作数据库,可以用JDBC.首先要加载驱动,之后建立连接,再然后就可以对数据库进行操作. 1.建立连接.此处用的是MySQL数据库 public class DBUtil { publi ...

  8. Android Studio插件:GsonFromat

    这个Android Studio插件可以根据JSONObject格式的字符串,自动生成实体类参数. 具体见:https://github.com/zzz40500/GsonFormat

  9. 最常用的ES6特性(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  10. C#和.net的版本

    C#1.0:OOP和CTS(delegate)C#2.0:泛型.分部类.静态类.迭代器.匿名方法.委托的协变和逆变.属性访问器可以被单独设置访问级别.可空类型.??操作符C# 3.0:Linq.lam ...