Redis 数据库入门指南

 2016年08月14日    504     声明


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备份可以使用GETBITSETBIT命令

使用示例

设置与取值

使用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取出一些最近插入的新元素。
  • 可以使用LPUSHLTRIM 创建一个不超过指定元素的列表,但只存储最近的 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
  • 通过SPOPSRANDMEMBER 命令,可以随机的提取集合中的元素。

使用示例

设置与取值

集合中的元素具有唯一性,所以我们可以向集合中多次添加同一个值,向集合中插入值使用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
$ # 连接已断开