Redis Lists

  • Redis Lists是通过链表实现的,对于一个数据系统,能向较长表中快速添加元素至关重要;
  • 通过lpush命令向表头添加元素的时间复杂度为O(1);
  • 通过rpush命令向表尾添加元素;
  • lrange命令列出两个参数(作为下标可以为负)之间的元素,时间复杂度为O(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:6379> rpush llist A
(integer) 1
127.0.0.1:6379> rpush llist B
(integer) 2
127.0.0.1:6379> lpush llist first
(integer) 3
127.0.0.1:6379> lrange llist 0 -1
1) "first"#0、-3
2) "A" #1、-2
3) "B" #2、-1
#可以使用rpush命令将多个元素一次性添加到表中
127.0.0.1:6379> rpush llist 1 2 "hello, world"
(integer) 6
> lrange llist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "hello, world"
  • 类似的可以使用lpop、rpop分别从表头、表尾检索并删除元素
1
2
3
4
127.0.0.1:6379> rpop llist
"hello, world"
127.0.0.1:6379> lpop llist
"first"
  • 对空表执行rpop、lpop将返回(nil);
  • redis lists可以用于分享页面的实现,新的分享生成后,将其ID通过rpush命令添加到表中,使用lrange命令在页面列出一定数量的分享
  • ltrim命令保留两个参数之间的元素,删除其余元素
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> rpush llist 3 4
(integer) 6
127.0.0.1:6379> ltrim llist 2 -1
OK
127.0.0.1:6379> lrange llist 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
  • 为了避免队列实现中,队列为空时,需要反复执行rpop、lpop命令带来的不良后果,redis lists提供了brpop、blpop命令
1
2
3
4
127.0.0.1:6379> brpop llist 5
1) "llist"
2) "4"
#等待执行删除命令,5秒后如果表仍为空,返回

Redis Hashes

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> hmset user:0 username voler country China
OK
127.0.0.1:6379> hget user:0 username
"voler"
127.0.0.1:6379> hgetall user:0
1) "username"
2) "voler"
3) "country"
4) "China"
#hmset、hget命令类似于set、get

Redis Sets

  • Redis Sets是字符串的无序集合;
  • 使用sismember命令检查参数是否为集合中的元素
1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> sadd sset 1 2 3
(integer) 3
127.0.0.1:6379> smembers sset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sismember sset 3
(integer) 1
127.0.0.1:6379> sismember sset 0
(integer) 0
  • redis sets可以用于标签的实现,为每个需要贴标签的实体关联一个sets,sets中保存标签的ID
1
2
3
127.0.0.1:6379> sadd blog:1:tags 2 5
(integer) 2
#为第1篇博文贴上2号、5号标签
1
2
3
4
5
127.0.0.1:6379> sadd tag:2:blog 1
(integer) 1
127.0.0.1:6379> sadd tag:5:blog 1
(integer) 1
#为第1篇博文贴上2号、5号标签
  • 获取为第1篇博文贴上的标签
1
2
3
127.0.0.1:6379> smembers blog:1:tags
1) "2"
2) "5"

Redis Sorted sets

  • Redis Sorted sets可以看做Sets与Hashes的组合;
  • sorted set中的每个元素与一个浮点数score相关联,与hash类似;
  • 将hackers的name作为sorted set的元素,birth作为score
1
2
3
4
5
6
127.0.0.1:6379> zadd hackers 1940 Tom
(integer) 1
127.0.0.1:6379> zadd hackers 1957 John
(integer 1)
127.0.0.1:6379> zadd hackers 1953 Tim
(integer) 1
  • 返回一个根据score已经完成排序的集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> zrange hackers 0 -1
1) "Tom"
2) "Tim"
3) "John"
#按照相反的规则排序
127.0.0.1:6379> zrevrange hackers 0 -1
1) "John"
2) "Tim"
3) "Tom"
#使用--withscores同时返回score
127.0.0.1:6379> zrange hackers 0 -1 withscores
1) "Tom"
2) "1940"
3) "Tim"
4) "1953"
5) "John"
6) "1957"
1
2
3
4
5
6
7
8
9
10
11
#使用zrangebyscore命令返回score位于两个参数之间的元素
#-inf表示负无穷
127.0.0.1:6379> zrangebyscore hackers -inf 1953
1) "Tom"
2) "Tim"
#使用zremrangebyscore命令删除score位于两个参数之间的元素,并返回被删元素的个数
127.0.0.1:6379> zremrangebyscore hackers 1953 1955
(integer) 1
#使用zrank命令返回参数在集合中的序号
127.0.0.1:6379> zrank hackers John
(integer) 1
1
2
3
4
5
6
7
8
9
10
11
12
#元素的score完全相等时,元素按字典序排序
127.0.0.1:6379> zadd hackers 0 V 0 O 0 L 0 L 0 E 0 R
(integer) 5
127.0.0.1:6379> zrange hackers 0 -1
1) "E"
2) "L"
3) "O"
4) "R"
5) "V"
127.0.0.1:6379> zrangebylex hackers [H [O
1) "L"
2) "O"
  • redis sorted sets可以用于积分榜的实现,每次执行zadd命令,集合会被更新,时间复杂度为log(n),使用zrank命令返回元素当前排名
    ```