Redis是一个开源的高性能key-value内存数据库。Redis拥有以下三个特点:
- 支持数据持久化。可以将内存中的数据保存在磁盘上,重启时可以再次加载使用。
- 除了简单的string数据类型,Redis还支持
list
,set
,zset
和hash
等复杂数据类型。 - 支持master-slave模式的数据备份。
Redis读写性能极高,并且所有的操作都是原子的。通常用于缓存或消息队列(发布/订阅模式)。
Redis中的基本数据类型包括:string
, list
, hash
, set
和zset
。
1. String
set key value
命令将key为"name"的记录value设置为"ivan"
> set name ivan
setnx key value
命令是"Set If Not Exists"的缩写,当key不存在时,等价于set
命令;当key存在时,什么操作也不做。
> get name
"ivan"
> setnx name ivan_new
(integer)0
>get name
"ivan"
setex key seconds value
命令将键key
的值设置为value
, 并将键key
的生存时间设置为 seconds
秒钟。
mset key1 value1 key2 value2 .....
命令一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
mget key1 key2 ....
一次获取多个key的值,如果对应key不存在,则对应返回nil。
msetnx
设置多个keys到他们相应的values上。只要有一个key已经存在,msetnx
一个操作都不会执行。
INCR key
命令为键 key 储存的数字值执行加1操作。
incrby key increment
为键 key 储存的数字值加上增量 increment 。如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。
2. List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部或者尾部。
LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头。例如对mylist
执行命令 LPUSH mylist a b c
,列表的值将是c b a
,这等同于原子性地执行LPUSH mylist a
、LPUSH mylist b
和 LPUSH mylist c
三个命令。
LRANGE key start stop
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
RPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
LPOP key
/RPOP key
移除并返回列表 key 的头/尾元素。
LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
下面是一个应用实例,要求取出top 10的评论:
MULTI
LPUSH comments "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
3. Hash
HSET hash field value
将哈希表 hash 中域 field 的值设置为 value 。如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
HGET hash field
命令返回给定域的值。如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil
HSETNX hash field value
当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。
HDEL key field [field …]
删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
4. Set
Set是一堆不重复值的集合。比如在 微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了 求交集、并集、差集等操作, 那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能。
SADD key member [member …]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
SISMEMBER key member
判断 member 元素是否集合 key 的成员。
SREM key member [member …]
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
SCARD key
返回集合中元素的数量。
SINTER key [key …]
返回一个集合的全部成员,该集合是所有给定集合的交集。
SINTERSTORE destination key [key …]
这个命令类似于 SINTER key [key …] 命令,但它将结果保存到 destination
集合,而不是简单地返回结果集。如果 destination
集合已经存在,则将其覆盖。
SUNION key [key …]
/SUNIONSTORE destination key [key …]
返回一个集合的全部成员,该集合是所有给定集合的并集。
SDIFF key [key …]
/SDIFFSTORE destination key [key …]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
5. Zset
Zset,有序集合和Set集合类似,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD key score member [[score member] [score member] …]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
ZSCORE key member
回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
ZINCRBY key increment member
为有序集 key 的成员 member 的 score 值加上增量 increment 。
ZCOUNT key min max
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
ZREM key member [member …]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
ZRANGE key start stop [WITHSCORES]
返回有序集 key
中,指定区间内的成员。其中成员的位置按 score
值递增(从小到大)来排序。具有相同 score
值的成员按字典序来排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
ZREVRANGE key start stop [WITHSCORES]
返回有序集 key
中,指定区间内的成员。其中成员的位置按 score
值递减(从大到小)来排列。 具有相同 score
值的成员按字典序的逆序排列。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
6. 常见数据结构的使用场景
string
string类型是最常见的一种类型,普通的key/value都可以存储在string类型中。
list
list用于存储列表信息,例如关注列表,粉丝列表,一条feed的评论列表等等。
set
Set提供一个与 List类似的列表功能,特殊之处在于Set会自动排序、去重,当需要存储一个列表数据,又不希望有重复数据时,Set是一个很好的选择。例如可以通过set存储关注列表/粉丝列表,对集合取交集、并集、差集,应用到好友推荐、共同关注等。
zset
如果需要一个有序且不重复的集合列表,可以选择sorted set数据结构,比如twitter的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
hash
可以通过Hash存储结构化的数据,例如一个学生信息对象数据,字段包括:id、姓名、班级、年龄等,通过id可以获取/修改任意的字段。
网友评论