Redis 数据库入门指南
Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库、缓存和消息代理使用。Redis 支持丰富的数据结构,有:字符串(Strings
)、哈希(Hashs
)、列表(Lists
)、集合(Sets
)、有序集合(SortedSets
)。Redis 内置了复制、Lua脚本、事务及不同级别的数据硬盘持久化机制,并提供了高可用的Redis Sentinel和自动分区的集群机制。是构建高性能、可扩展的 Web 应用程序的有效手段。
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 的字符串类型做很多有用事情,如:
- 字符串类型可以做为原子计数器使用,可使用的方法有:INCR、DECR、INCRBY
- 使用APPEND命令向字符串追加内容
- 使用字符串的GETRANGE和SETRANGE命令可以做为一个随机存取向量
- 对很多在很小的空间数据,或创建一个Redis备份可以使用GETBIT 和 SETBIT命令
使用示例
设置与取值
使用SET
命令可以设置一个字符串类型的值,多次调会导致已存在key
的值被修改。
使用GET
可以获取已存在字符串key
的值:
redis> set mySite itbilu
OK
redis> set mySite itbilu.com
OK
redis> get mySite
"itbilu.com"
自增、自减
“字符串”类型中不仅可以存字符串值,还可存取整型值/浮点数值。
Redis 提供了INCR
、DECR
等命令,用于整型值的自增、自减等操作。而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"
批量操作
字符串类型支持批量操作,使用MSET
、MSETNX
可以批量设置字符串类型的key-value
,MSETNX
仅当不存在时才会设置。
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。
使用示例
设置与取值
设置一个列表类型值的方式较多。可以通过LPUSH
或LRUSH
向列表的开头或结尾插入数据,也可以通过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
有效期,可以使用EXPIRE
和PEXPIRE
设置有效期,EXPIRE
通过秒数表示有期,而PEXPIRE
使用毫秒设置key
的有效期;还可以使用EXPIREAT
和PEXPIREAT
设置key
的到期时间,二者通过一个UNIX 时间戳表示key
到期时间,不同的是前者是一个秒级时间戳,后者是一个毫秒级时间戳。
对于设置过有效期的键,我们可以通过TTL
或PTTL
查看键的过期时间,前者使用秒数表示,后者使用毫秒数表示。
设置键的到期时间后,还可以通过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
)。订阅者可以通过SUBSCRIBE
或PSUBSCRIBE
命令订阅自己所需要的消息类型。当发布者通过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
$ # 连接已断开