我们在之前java的集合类中就曾经接触过set.在Java的集合框架中,set的实现方式可以是HashSet,也可以是TreeSet.
在Redis的集合中,就是把一些有关联的数据放在一起,其中保存的是多个字符串类型的元素.和Java中的set一样,set中的元素也是无序的,而且不允许重复.这里的条件完全和list相对,list中的元素可以重复,而且是有序的.Redis中的set还支持求交集,并集,差集.
在set的相关操作指令中一般都包含s前缀.
sadd key member [member...]smembers key127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sadd key 2
(integer) 0
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
sismember key member127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SISMEMBER key 2
(integer) 1
127.0.0.1:6379> SISMEMBER key 5
(integer) 0
scard key127.0.0.1:6379> SCARD key
(integer) 4
spop key [count]127.0.0.1:6379> SPOP key 2
1) "1"
2) "2"
127.0.0.1:6379> spop key
"4"
smove source destination member127.0.0.1:6379> SMEMBERS key
1) "3"
127.0.0.1:6379> SADD key 1 2 4
(integer) 3
127.0.0.1:6379> SADD key1 1
(integer) 1
127.0.0.1:6379> SMOVE key key1 2
(integer) 1
127.0.0.1:6379> SMEMBERS key1
1) "1"
2) "2"
如果移动给destination的元素和原来destination的元素是重复的,那么set也会自动去重.
127.0.0.1:6379> SADD key 2
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SMOVE key key1 2
(integer) 1
127.0.0.1:6379> SMEMBERS key1
1) "1"
2) "2"
如果移动的元素在source中不存在,那么就返回的是0.
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> SMOVE key key1 2
(integer) 0
srem key member [member...]127.0.0.1:6379> SREM key 3 4
(integer) 2
127.0.0.1:6379> SMEMBERS key
1) "1"
集合间的常见操作是求集合间的交集,并集和差集.
sinter key [key...]127.0.0.1:6379> SADD key 1 2 3 4
(integer) 4
127.0.0.1:6379> SADD key1 3 4 5 6
(integer) 4
127.0.0.1:6379> SINTER key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SINTER key key1
1) "3"
2) "4"
sinterstore destination key [key...]127.0.0.1:6379> sadd key2 1
(integer) 1
127.0.0.1:6379> SINTERSTORE key2 key1 key
(integer) 2
127.0.0.1:6379> SMEMBERS key2
1) "3"
2) "4"
sunion key [key...]127.0.0.1:6379> SUNION key key1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SUNION key
1) "1"
2) "2"
3) "3"
4) "4"
sunionstore destination key [key...]127.0.0.1:6379> sadd key2 8
(integer) 1
127.0.0.1:6379> SUNIONSTORE key2 key1 key
(integer) 6
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
sdiff key [key...]127.0.0.1:6379> SDIFF key1 key
1) "5"
2) "6"
127.0.0.1:6379> SDIFF key key1
1) "1"
2) "2"
sdiffstore destination key [key...]127.0.0.1:6379> SDIFFSTORE key2 key key1
(integer) 2
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "2"
Redis中的set的编码方式主要有两种,一种是intset,一种是hashtable.
127.0.0.1:6379> SADD key3 1 2 3 4
(integer) 4
127.0.0.1:6379> OBJECT encoding key3
"intset"
127.0.0.1:6379> sadd key3 aaa
(integer) 1
127.0.0.1:6379> OBJECT encoding key3
"hashtable"
我们知道,在hashtable的编码在hash类型的数据中也存在,set中的编码也存在hashtable,这和Java中的set接口的实现方式可以是HashSet有些类似.
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
所谓zset,指的就是有序集合,有序集合中和集合set类似,其中的元素都是不可重复的,但是与set不同的是,set中的元素是有序的,在zset中,我们为member引入了score属性,在为member排序的时候,我们就是按照分数(score)来对member进行排序的,如果有其中两个元素的分数是相同的,那么就按照他们的字典序来排序,排列时,默认按照升序的方式来排列.但其中zset中存储的元素主要还是member,score只是对member起到了辅助作用.
zadd key [NX|XX] [GT|LT] [CH] [INCR] socre member [socre member...]其中,member和score可以理解为一个普通的pair,不可以把他们理解为哈希的关系,因为这里并没有明确谁是键,谁是值,他们是双向的,既可以通过member来找score,又可以通过score来找member.
[NX|XX],如果没有这两个参数中的其中一个的话,那么在添加元素和分数的时候,如果元素不存在,则添加新的元素和分数,如果元素已经存在,则会更新分数.
其中nx属性指的是只可以新建元素,不可以更新元素,和前面string类型中的类似,如果存在,就不添加,如果不存在,就添加.
xx属性指的是只可以更新元素,不可以新建元素,和前面的string类型中的类似,如果不存在,则不新建,如果存在,则覆盖掉之前的value.
[LT|GT],其中,LT是less than的缩写,GT是greater than的缩写,加上两个属性之后,如果加上LT属性,则在指定分数低于原来的分数的时候更新元素,如果加上的是GT属性,则在指定分数高于原来分数的时候更新元素,这两个属性并不会影响添加新的元素.
[CH],是change的缩写,在加上这个属性之前,返回值只包含成功添加的元素,在加上这个属性之后,就会包含更新的元素.
[INCR],类似与zincrby的效果,将指定的元素添加上对应的分数,此时只可以指定一个元素和分数.
zrange key start stop [withscores]zrange key 0 -1 withscores表示的是返回zset中所有的元素.,zset中的元素是有序的,谁在前谁在后都是很明确的,所以就可以赋予有序集合中的元素"下标"这样的概念.127.0.0.1:6379> zadd key 97 zhaoyun 93 zhangfei 96 guanyu 95 huangzhong
4
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
97
127.0.0.1:6379> zadd key 99 zhaoyun
0
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
99
127.0.0.1:6379> zadd key nx ch 98 zhaoyun
0
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
99
127.0.0.1:6379> zadd key xx ch 98 zhaoyun
1
127.0.0.1:6379> ZRANGE key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
98
127.0.0.1:6379> zadd key ch incr 2 huangzhong
97
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
huangzhong
97
zhaoyun
98
zcard key127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
huangzhong
97
zhaoyun
98
127.0.0.1:6379> zcard key
4
zcount key min max-inf和+inf来表示正无穷和负无穷.127.0.0.1:6379> ZCOUNT key 93 97
3
127.0.0.1:6379> ZCOUNT key (93 97
2
127.0.0.1:6379> ZCOUNT key -inf +inf
4
127.0.0.1:6379> ZCOUNT key 92.5 97
3
zrevrange key start stop [withsocres]zrevrange key 0 -1 withscores表示的是降序打印所有的元素.127.0.0.1:6379> ZREVRANGE key 0 -1 withscores
zhaoyun
98
huangzhong
97
guanyu
96
zhangfei
93
zrangebyscore key min max [withsocres]-inf和+inf来表示正无穷和负无穷.127.0.0.1:6379> ZRANGEBYSCORE key 93 97 withscores
zhangfei
93
guanyu
96
huangzhong
97
127.0.0.1:6379> ZRANGEBYSCORE key (93 97 withscores
guanyu
96
huangzhong
97
127.0.0.1:6379> ZRANGEBYSCORE key (93 96.5 withscores
guanyu
96
zpopmax key [count]127.0.0.1:6379> ZADD key 98 machao
1
127.0.0.1:6379> ZREVRANGE key 0 -1 withscores
zhaoyun
98
machao
98
huangzhong
97
guanyu
96
zhangfei
93
127.0.0.1:6379> ZPOPMAX key
zhaoyun
98
127.0.0.1:6379> ZPOPMAX key
machao
98
127.0.0.1:6379> ZADD key 98 zhaoyun
1
127.0.0.1:6379> zadd key 98 machao
1
127.0.0.1:6379> ZPOPMAX key 2
zhaoyun
98
machao
98
bzpopmax key [key...] timeout27.0.0.1:6379> zadd key 98 zhaoyun
1
127.0.0.1:6379> BZPOPMAX key 5
key
zhaoyun
98
127.0.0.1:6379> ZADD key1 98 machao
1
127.0.0.1:6379> BZPOPMAX key key1 5
key
huangzhong
97
//客户端1
127.0.0.1:6379> BZPOPMAX key2 100
key2
zhugeliang
96
//客户端2
127.0.0.1:6379> zadd key2 96 zhugeliang
(integer) 1
zpopmin key [count]127.0.0.1:6379> ZADD key 91 machao 91 zhugeliang
2
127.0.0.1:6379> ZPOPMIN key
machao
91
127.0.0.1:6379> ZPOPMIN key
zhugeliang
91
127.0.0.1:6379> ZADD key 91 machao 91 zhugeliang
2
127.0.0.1:6379> ZPOPMIN key 2
machao
91
zhugeliang
91
127.0.0.1:6379> zadd key 97 zhaoyun 94 machao
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
machao
94
guanyu
96
zhaoyun
97
127.0.0.1:6379> zrank key machao
1
127.0.0.1:6379> zrank key zhangfei
0
zrevrank key member127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
machao
94
guanyu
96
zhaoyun
97
127.0.0.1:6379> ZREVRANK key zhaoyun
0
zscore key member127.0.0.1:6379> ZSCORE key zhaoyun
97
zrem key member [member...]127.0.0.1:6379> ZREM key machao
1
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
zremrangebyrank key start stop127.0.0.1:6379> ZADD key 98 machao 99 liubei
2
127.0.0.1:6379> ZREMRANGEBYRANK key 0 1
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhaoyun
97
machao
98
liubei
99
zremrangebyscore key max min127.0.0.1:6379> zadd key 98 machao 99 liubei
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
machao
98
liubei
99
127.0.0.1:6379> ZREMRANGEBYSCORE key 98 99
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
zincrby key incrment memberzadd key incr score member指令类似.127.0.0.1:6379> zrange key 0 -1 withscores
zhaoyun
97
machao
98
liubei
99
127.0.0.1:6379> ZINCRBY key 2 zhaoyun
99
127.0.0.1:6379> zrange key 0 -1 withscores
machao
98
liubei
99
zhaoyun
99
集合间的操作我们在上一篇文章中提到过,包含交集,差集,并集.那么在zset中,有没有与set中类似的zinter,zunion,zdiff的指令呢?在Redis6.2之后的版本确实有,但是在我们当前Redis5的版本中没有这样的指令.
zset中常见的集合间操作指令有两个,zinterstore,zunionstore.
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
这里为什么要使用numkeys指定求交集的key的个数.这是因为在key之后还有其他的一些属性,我们要使用numkeys把key和其他属性做出区分.这个功能和我们之前学习http协议的时候,报头中的content-length的功能有些相似.用于区分开报头和正文.
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> zadd key 99 zhaoyun 97 liubei 96 caocao 95 machao
4
127.0.0.1:6379> zadd key1 97 zhaoyun 92 zhangfei 93 caocao 97 huangzhon
4
127.0.0.1:6379> zadd key2 93 zhugeliang
1
127.0.0.1:6379> ZINTERSTORE key2 2 key key1 aggregate sum
2
127.0.0.1:6379> zrange key2 0 -1 withscores
caocao
1
zhaoyun
196
127.0.0.1:6379> ZINTERSTORE key2 2 key key1 weights 1.2 1.5
(integer) 2
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "caocao"
2) "254.69999999999999"
3) "zhaoyun"
4) "2.30000000000001"
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]127.0.0.1:6379> zunionstore key2 2 key key1 aggregate sum
(integer) 6
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "zhangfei"
2) "92"
3) "machao"
4) "95"
5) "huangzhon"
6) "97"
7) "liubei"
8) "97"
9) "caocao"
10) "1"
11) "zhaoyun"
12) "196"
127.0.0.1:6379> ZUNIONSTORE key2 2 key key1 weights 1.2 1.5 aggregate sum
(integer) 6
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "machao"
2) "114"
3) "liubei"
4) "116.39999999999999"
5) "zhangfei"
6) "138"
7) "huangzhon"
8) "145.5"
9) "caocao"
10) "254.69999999999999"
11) "zhaoyun"
12) "2.30000000000001"
zset内部编码方式主要有两种方式,一种是ziplist,一种是skiplist.
127.0.0.1:6379> zadd key1 91 aaa 92 bbb 98 ccc
(integer) 3
127.0.0.1:6379> OBJECT encoding key1
"ziplist"
127.0.0.1:6379> zadd key1 nx 94 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> OBJECT encoding key1
"skiplist"
zset最典型的应用场景,就是排行榜系统.比如微博热搜,游戏天梯排行系统等.最关键的要点就是,排行榜的分数是实时变化的.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务