redis笔记04-无序集合和有序集合

目录

【无序集合】

单个集合的操作

多个集合的操作

【有序集合】

【使用有序集合实现排行榜】

【无序集合和有序集合速记】


【无序集合】

无序集合的特点: 唯一性,无序性,确定性

单个集合的操作

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 ...]:取交集/并集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮尘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值