1 set
Redis的set(集合)内部的键值对是无序的、唯一的。它的内部实现了一个所有value为null的特殊字典。就相当于上面的哈希,只不过value值为null。例如哈希是cmd key key value,那么set就是cmd key key,所以末尾的key当成value了。
如果set集合存储的都是整数类型,那么会使用一个数组存储,此时集合会是一个有序的集合,这样让我们能快速进行交并差运算。(老师讲的)
set(集合)由于其特殊去重复的功能,我们可以用来存储活动中中奖的用户的ID,这样可以保证一个用户不会中奖两次。
2 基础命令
2.1 SADD、SCARD、SMEMBERS、SISMEMBER
SADD key member [member ...]
SCARD key
SMEMBERS key
SISMEMBER key member
- 演示SADD、SCARD(主要按照上面的描述执行):
- 演示SMEMBERS、SISMEMBER(主要按照上面的描述执行):
2.2 SRANDMEMBER、SPOP
SRANDMEMBER key [count]
SPOP key [count]
- 1)演示SRANDMEMBER(主要按照上面的描述执行):由于比较长,所以截取文本。
192.168.1.9:6379> SMEMBERS tyy
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "b"
8) "y"
192.168.1.9:6379> SRANDMEMBER tyy
"x"
192.168.1.9:6379> SRANDMEMBER tyy
"f"
192.168.1.9:6379> SRANDMEMBER tyy
"g"
192.168.1.9:6379> SMEMBERS tyy
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "b"
8) "y"
192.168.1.9:6379> SRANDMEMBER tyy 3
1) "x"
2) "c"
3) "y"
192.168.1.9:6379> SRANDMEMBER tyy 3
1) "f"
2) "z"
3) "y"
192.168.1.9:6379> SRANDMEMBER tyy 10
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "b"
8) "y"
192.168.1.9:6379> SRANDMEMBER tyy 10
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "b"
8) "y"
192.168.1.9:6379> SRANDMEMBER tyy -3
1) "f"
2) "x"
3) "c"
192.168.1.9:6379> SRANDMEMBER tyy -3
1) "z"
2) "x"
3) "y"
192.168.1.9:6379> SRANDMEMBER tyy -10
1) "b"
2) "f"
3) "z"
4) "x"
5) "b"
6) "z"
7) "g"
8) "b"
9) "b"
10) "x"
192.168.1.9:6379> SRANDMEMBER tyy -10
1) "g"
2) "b"
3) "f"
4) "y"
5) "y"
6) "c"
7) "x"
8) "f"
9) "x"
10) "f"
192.168.1.9:6379>
- 2)演示SPOP(主要按照上面的描述执行):同样由于比较长,所以截取文本。
192.168.1.9:6379> SMEMBERS tyy
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "b"
8) "y"
192.168.1.9:6379> SPOP tyy
"b"
192.168.1.9:6379> SMEMBERS tyy
1) "f"
2) "a"
3) "g"
4) "c"
5) "x"
6) "z"
7) "y"
192.168.1.9:6379> SPOP tyy 2
1) "y"
2) "x"
192.168.1.9:6379> SMEMBERS tyy
1) "f"
2) "a"
3) "g"
4) "c"
5) "z"
192.168.1.9:6379> SPOP tyy 10
1) "a"
2) "f"
3) "c"
4) "g"
5) "z"
192.168.1.9:6379> SMEMBERS tyy
(empty array)
192.168.1.9:6379> SADD tyy a b c d e
(integer) 5
192.168.1.9:6379> SPOP tyy -2
(error) ERR value is out of range, must be positive
192.168.1.9:6379> SMEMBERS tyy
1) "a"
2) "c"
3) "b"
4) "d"
5) "e"
192.168.1.9:6379> SPOP tyy -10
(error) ERR value is out of range, must be positive
192.168.1.9:6379>
192.168.1.9:6379>
192.168.1.9:6379> EXISTS tyy111
(integer) 0
192.168.1.9:6379> SPOP tyy111
(nil)
192.168.1.9:6379> SPOP tyy111 2
(empty array)
192.168.1.9:6379>
2.3 SDIFF、SINTER、SUNION
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
192.168.1.9:6379> SADD s1 a b c
(integer) 3
192.168.1.9:6379> SADD s2 c d e
(integer) 3
192.168.1.9:6379> SDIFF s1 s2
1) "a"
2) "b"
192.168.1.9:6379> SADD set1 a b c d
(integer) 4
192.168.1.9:6379> SADD set2 c
(integer) 1
192.168.1.9:6379> SADD set3 a c e
(integer) 3
192.168.1.9:6379> SDIFF set1 set2 set3
1) "b"
2) "d"
192.168.1.9:6379>
192.168.1.9:6379> SADD set11 a b c d
(integer) 4
192.168.1.9:6379> SADD set22 a c f
(integer) 3
192.168.1.9:6379> SADD set33 o p q
(integer) 3
192.168.1.9:6379> SDIFF set11 set22 set33
1) "b"
2) "d"
192.168.1.9:6379>
192.168.1.9:6379> EXISTS tyy111
(integer) 0
192.168.1.9:6379> EXISTS s111
(integer) 0
192.168.1.9:6379> EXISTS s1
(integer) 1
192.168.1.9:6379> SDIFF s111 s1
(empty array)
192.168.1.9:6379> SMEMBERS s1
1) "a"
2) "c"
3) "b"
192.168.1.9:6379> SDIFF s1 s111
1) "a"
2) "b"
3) "c"
3 存储结构
如果set集合存储的都是整数类型,那么会使用一个数组存储,此时集合会是一个有序的集合(可以认为是内部有序,方便理解),这样让我们能快速进行交并差运算。否则使用字典存储。
4 应用
4.1 抽奖
SADD Award:1 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010
SMEMBERS Award:1
SRANDMEMBER Award:1 3
SRANDMEMBER Award:1 3
SMEMBERS Award:1
SPOP Award:1 3
SPOP Award:1 2
SPOP Award:1 1
注意:因为下面我的redis版本不支持SPOP的count参数,我的版本是windows redis-cli 3.0.504版本。 不支持SPOP的count参数的结果: 支持SPOP的count参数的结果:
4.2 共同关注
抖音、微博这些APP都有共同关注的功能,那么他们是如何实现的呢? 实际不难,共同关注的功能我们可以使用交集去处理。例如A关注了一些人,B也关注了一些人,那么对A和B进行取交集,即可得到共同关注的人。 例如:
4.3 推荐好友
推荐好友的功能也不难,例如A关注了一些好友,B也关注了一些好友,那么对A和B进行取差集,即可得到我有而你没有的好友。这样就达到了推荐好友的功能,即可能认识的人。 例如:经过下面的差集运算,就得到B可能认识的人。
|