目录
【无序集合】
无序集合的特点: 唯一性,无序性,确定性
单个集合的操作
sadd key value1 value2 作用: 往集合key中增加元素
备注:由于具有唯一性,所以增加一个已经存在的元素时会返回0.
scard key 作用: 返回集合中元素的个数
smembers key 作用: 返回集中中所有的元素
srandmember key 作用: 返回集合key中,随机的1个元素.
sismember key value 作用: 判断value是否存在key集合中,存在是返回1,不存在返回0。
srem key value1 value2 作用: 删除集合中值为 value1 value2的元素;返回值: 忽略不存在的元素后,真正删除掉的元素的个数
spop key 作用: 返回并删除集合key中1个随机元素。随机--体现了无序性
127.0.0.1:6379> sadd key A A B C D
(integer) 4
127.0.0.1:6379> smembers key
1) "D"
2) "C"
3) "B"
4) "A"
127.0.0.1:6379> srem key A
(integer) 1
127.0.0.1:6379> sismember key A
(integer) 0
127.0.0.1:6379> scard key
(integer) 3
127.0.0.1:6379> srandmember key
"C"
127.0.0.1:6379> spop key
"B"
127.0.0.1:6379> scard key
(integer) 2
多个集合的操作
smove key1 key2 value 作用:把key1中的value删除,并添加到key2集合中.(或者说把key1中的value值移动到key2中)
sinter key1 key2 key3 作用: 计算key1 key2 key3 三个集合中的交集,并返回
sinterstore dest1 key1 key2 key3 作用: 计算key1 key2 key3 三个集合中的交集,并存储到dest1
sunion key1 key2.. Keyn 作用: 计算key1 key2 keyn的并集,并返回
sunionstore dest2 key1 key2.. Keyn 作用: 计算key1 key2 keyn的并集, 并存储到dest2
sdiff key1 key2 key3 作用: 计算key1与key2 key3的差集,即key1-key2-key3
sdiffstore dest3 key1 key2 key3 作用: 计算key1与key2 key3的差集, 并存储到dest3
127.0.0.1:6379> sadd user1 A B C
(integer) 3
127.0.0.1:6379> sadd user2 B C D
(integer) 3
127.0.0.1:6379> sdiff user1 user2
1) "A"
127.0.0.1:6379> sdiff user2 user1
1) "D"
127.0.0.1:6379> sdiffstore res1 user1 user2
(integer) 1
127.0.0.1:6379> smembers res1
1) "A"
127.0.0.1:6379> sinter user1 user2
1) "C"
2) "B"
127.0.0.1:6379> sinterstore res2 user1 user2
(integer) 2
127.0.0.1:6379> smembers res2
1) "C"
2) "B"
127.0.0.1:6379> sunion user1 user2
1) "B"
2) "A"
3) "C"
4) "D"
127.0.0.1:6379> sunionstore res3 user1 user2
(integer) 4
127.0.0.1:6379> smembers res3
1) "B"
2) "A"
3) "C"
4) "D"
127.0.0.1:6379> smove user1 user2 A
(integer) 1
127.0.0.1:6379> smembers user2
1) "D"
2) "C"
3) "B"
4) "A"
【有序集合】
zadd key score1 value1 score2 value2 .. 作用:给有序集合添加元素
[例如] zadd stu 18 lily 19 hmm 20 lilei 21 lilei
zrange key start stop [WITHSCORES] 作用:把集合排序后,返回名次[start,stop]的元素,默认是升续排列。Withscores 是把score也打印出来。取出所有数据start=0,stop=-1即可。
例如:取出第1名到第2名的数据,由小到大排列。
zrevrange key start stop [WITHSCORES] 作用:把集合降序排列,取名字[start,stop]之间的元素。
zrangebyscore key min max [withscores] [limit offset N] 作用: 取分数介于min和max之间的,按照分数升续排序;
limit offset N:取score在[min,max]内的元素,并跳过 offset个, 取出N个
例如:获取分数介于1到20之间的,跳过第0位,从1位开始取,取两个,即:limit 1 2.
zrevrangebyscore key max min [withscores] [limit offset N] 作用: 取分数介于max和min之间的,按照分数降续排序;注意这里是max到min!!
zrank key member 作用:查询member的排名(升续 从0名开始)
zrevrank key memeber 作用:查询 member的排名(降续 从0名开始)
例如:升序情况下poly是第0名,降序情况下是第3名。
127.0.0.1:6379> zadd user 10 A 20 B 30 C
(integer) 3
127.0.0.1:6379> zscore user A
"10"
127.0.0.1:6379> zrange user 0 -1
1) "A"
2) "B"
3) "C"
127.0.0.1:6379> zrange user 0 -1 withscores
1) "A"
2) "10"
3) "B"
4) "20"
5) "C"
6) "30"
127.0.0.1:6379> zrevrange user 0 -1
127.0.0.1:6379> zrevrange user 0 -1 withscores
127.0.0.1:6379> zrangebyscore user 10 22
127.0.0.1:6379> zrangebyscore user 10 22 withscores
1) "A"
2) "10"
3) "B"
4) "20"
127.0.0.1:6379> zrevrangebyscore user 22 10
127.0.0.1:6379> zrevrangebyscore user 22 10 withscores
1) "B"
2) "20"
3) "A"
4) "10"
127.0.0.1:6379> zrank user A
(integer) 0
127.0.0.1:6379> zrevrank user A
(integer) 2
zrem key value1 value2 .. 作用: 删除集合中的元素
例如:删除name是lily和poly的。
zremrangebyscore key min max 作用: 按照socre来删除元素,删除score在[min,max]之间的
例如:恢复原始数据,删除score介于10到15的。
zremrangebyrank key start end 作用: 按排名删除元素,删除名次在[start,end]之间的
例如:恢复原始数据,删除名次介于第0名到第2名的。
zcard key 作用:返回元素个数
zcount key min max 作用:返回分数在 [min,max] 区间内元素的数量,左右闭合区间。如果需要开区间,加上使用 ( 和 ) 。
127.0.0.1:6379> zcard user
(integer) 3
127.0.0.1:6379> zcount user 10 30 // >=10 && <=30区间的个数
(integer) 3
127.0.0.1:6379> zcount user (10 30 // >10 && <=30区间的个数
(integer) 2
127.0.0.1:6379> zcount user (10 (30 // >=10 && <30区间的个数
(integer) 1
zincrby:score增加指定的值。
zrem:弹出一个元素。
zlexcount:返回指定区间内的成员数量。
zrangebylex:返回指定区间内的成员。
127.0.0.1:6379> zincrby user 5 A
"15"
127.0.0.1:6379> zrem user C
(integer) 1
127.0.0.1:6379> zlexcount user - + //最小区间到最大区间范围的数量
(integer) 2
127.0.0.1:6379> zlexcount user A B //错误
(error) ERR min or max not valid string range item
127.0.0.1:6379> zlexcount user [A [B //A到B区间范围的数量,包含A和B
(integer) 2
127.0.0.1:6379> zlexcount user (A (B //A到B区间范围的数量,不包含A和B
(integer) 0
127.0.0.1:6379> zrangebylex user - +
1) "A"
2) "B"
127.0.0.1:6379> zrangebylex user [A [B
1) "A"
2) "B"
127.0.0.1:6379> zrangebylex user (A (B
(empty array)
zinter / zinterstore:给两个集合求交集,并且结果中的score相加。
zunion / zunionstore:给两个集合求并集,并且结果中的score相加。
zinterstore destination numkeys key1 [key2 ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算key1,key2的交集,key1,key2的权重分别是 weight1,weight2
聚合方法用: sum|min|max,聚合的结果,保存在dest集合内。
【举例】lisi买了3只cat、5只dog、6只horse;wang买了2只cat、6只dog、8只horse、1只donkey。取两者的交集并存储在报表里。
ZADD lisi 3 cat 5 dog 6 horse
ZADD wang 2 cat 6 dog 8 horse 1 donkey
ZINTERSTORE result 2 lisi wang
取最小的和最大的,加上 aggregate min / aggregate max
加上权重 weights,相当于翻多少倍:
zunionstore destination numkeys key1 [key2 ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
取并集,和上面类似。
127.0.0.1:6379> zadd zhangsan 10 A 20 B 30 C
(integer) 3
127.0.0.1:6379> zadd lisi 20 B 30 C 40 D
(integer) 3
127.0.0.1:6379> zinterstore res1 2 zhangsan lisi
(integer) 2
127.0.0.1:6379> zrange res1 0 -1 withscores
1) "B"
2) "40"
3) "C"
4) "60"
127.0.0.1:6379> zunionstore res2 2 zhangsan lisi
(integer) 4
127.0.0.1:6379> zrange res2 0 -1 withscores
1) "A"
2) "10"
3) "B"
4) "40"
5) "D"
6) "40"
7) "C"
8) "60"
【有序集合与列表都是有序的,它俩的区别】
- 列表 list 是通过双向链表实现的,在操作左右两侧的数据时会非常快,而对于中间的数据操作则相对较慢。有序集合采用 hash 表的结构来实现,读取排序在中间部分的数据也会很快。
- 有序集合可以通过 score 来完成元素位置的调整,但如果我们想要对列表进行元素位置的调整则会比较麻烦。
【使用有序集合实现排行榜】
* 统计全部玩家的排行榜:ZREVRANGE user_score 0 -1 WITHSCORES
* 统计前 10 名玩家:ZREVRANGE user_score 0 9
* 查询玩家10001的分数:ZSCORE user_score 10001,时间复杂度为O(1)。
* 查询玩家10001的排名:ZREVRANK user_score 10001,时间复杂度为O(log(N))。
* 对玩家10001的分数减1:ZINCRBY user_score -1 10001,时间复杂度为O(log(N))。
* 查询玩家10001前后5名玩家(当前玩家10001的排名是36):ZREVRANGE user_score 31 41。
* 删除玩家 10001:ZREM user_score 10001,时间复杂度为O(log(N))。
* 把玩家10001的信息再增加回来:ZADD user_score 36 10001。时间复杂度为O(log(N))。
【无序集合和有序集合速记】
sadd key value1 value2: 往集合key中增加元素.
scard key : 返回元素个数。
smambers key: 返回所有元素。
srandmember key: 返回随机的1个元素。
sismember key v: 判断v是否存在key中,1/0。
srem key v1 v2:删除值为v1和v2的元素,返回真正删除掉的个数。
spop key:返回并删除集合key中1个随机元素。
smove key1 key2 value:把key1中的value值移动到key2中。
sinter k1 k2 k3: 求三者的交集然后返回。
sinterstore dest1 k1 k2 k3: 求交集然后赋给dest1。
sunion k1 k2 k3: 求并集然后返回。
sunionstore dest2 k1 k2 k3: 求并集然后赋给dest2。
sdiff k1 k2 k3: 求差集然后返回。
sdiffstore dest3 k1 k2 k3: 求差集然后赋给dest3。
zadd key score1 value1 score2 value2 .. : 给有序集合添加元素。
zcard key: 返回元素个数。
zcount key min max:分数在[min,max]区间内元素的数量。
zrange/zrevrange key start stop [WITHSCORES] :集合升序/降序排列后返回名次[start,stop]的元素。全部:[0,-1]。
zrangebyscore/zrevrangebyscore key min max [withscores] [limit offset N]: 分数min和max按照分数升续/降序排序。
zrank/zrevrank key member:升序/降序后查询member的排名。
zrem key value1 value2... : 删除集合中的元素。
zremrangebyscore key min max :删除socre在[min,max]之间的。
zremrangebyrank key start end: 删除排名在[start,end]之间的。
zinterstore/zunionstore destination numkeys key1 [key2 ...]:取交集/并集。