您的位置:首页 > 数据库 > Redis

redis中sorted set(有序集合)操作(五)

weixin_43113679 2019-05-11 23:18 38 查看
版权声明:如需转载,请写明出处 https://blog.csdn.net/weixin_43113679/article/details/90116653

sorted set和前一篇文章的set的区别就是它是会自己排序的,但又不像java中按插入的顺序排序或者字符串排序,是添加的时候需要自己添加一个分数,因为是set所以不允许重复,但是分数可以重复,大家可以理解为map,set的值为map的key,分数为map的value,排序根据分数来进行排序,当然可以正序也可以反序,感觉适合做排行榜一类的

命令示例

1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:(增加/统计所有的数量/统计指定分数之间数量/移除成员/获取指定成员分数/查询指定分数之间的成员/查询排名)

127.0.0.1:6379> del myset //清空数据
(integer) 1
127.0.0.1:6379> zadd myset 1 one //添加一个1分数为1的成员
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three //添加两个分数分别是2和3的两个成员
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 //展示myset里所有的值
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zrange myset 0 -1 withscores /WITHSCORES选项表示返回的结果中包含每个成员及其分数
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
127.0.0.1:6379> zrank myset one //获取成员one在Sorted-Set中的位置索引值。0表示第一个位置
(integer) 0
127.0.0.1:6379> zrank myset four //成员four并不存在,因此返回nil
(nil)
127.0.0.1:6379> zcard myset //获取myzset键中成员的数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2 //返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量
(integer) 2
127.0.0.1:6379> zrem myset one two //删除成员one和two,返回实际删除成员的数量
(integer) 2
127.0.0.1:6379> zcard myset //查看是否删除成功
(integer) 1
127.0.0.1:6379> zscore myset three //获取成员three的分数。返回值是字符串形式
"3"
127.0.0.1:6379> zscore myset two //由于成员two已经被删除,所以该命令返回nil
(nil)
//因为先前删除了,没有,所以创建新的默认分数为0,将成员one的分数增加2,并返回该成员更新后的分数
127.0.0.1:6379> zincrby myset 2 one
"2"
127.0.0.1:6379> zincrby myset -1 one   //减1,返回分数,虽然是整型,但是保存的还是字符串形式
"1"
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "1"
3) "three"
4) "3"
127.0.0.1:6379> zadd myset 3 four    //添加一个分数也为3的成员
(integer) 1
127.0.0.1:6379> zrange myset 0 -1 withscores   //展示值和分数,明显新加入的相同分数的在旧的相同分数的前面
1) "one"
2) "1"
3) "four"
4) "3"
5) "three"
6) "3"
127.0.0.1:6379> zadd myset 3 five  //再添加一个分数为3的,这样看更明显
(integer) 1
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "one"
2) "1"
3) "five"
4) "3"
5) "four"
6) "3"
7) "three"
8) "3"

2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCORE(根据分数查询成员/根据排名删除/根据分数删除)

127.0.0.1:6379> del myset
(integer) 1
127.0.0.1:6379> zadd myset 1 one 2 two 3 three 4 four
(integer) 4
127.0.0.1:6379> zrangebyscore myset 1 2 //获取分数满足表达式1 <= score <= 2的成员
1) "one"
2) "two"
127.0.0.1:6379> zrangebyscore myset (1 2 // 获取分数满足表达式1 < score <= 2的成员
1) "two"
//-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己
//2表示从位置索引(0-based)等于2的成员开始,去后面3个成员,很像sql语句里的limit,感觉可以用于分页
127.0.0.1:6379> zrangebyscore myset -inf +inf limit 2 3  //
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyscore myset 1 2 //删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 //看出一下上面的删除是否成功
1) "three"
2) "four"
127.0.0.1:6379> zremrangebyrank myset 0 1  //删除位置索引满足表达式0 <= rank <= 1的成员
(integer) 2
127.0.0.1:6379> zcard myset //查看上一条命令是否删除成功
(integer) 0

这里说明一下,对于zrangebyscore中的>=号的问题,
只允许出现<=,不允许出现>=,否则报错:(error) ERR min or max is not a float
也就是说只能(1 2] 或者[1 2] ,不允许出现(1 2) 或者[1 2);否则报错
3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:(反序查找成员/反序根据分数查找/反序根据排名查找)

127.0.0.1:6379> del myset
(integer) 0
127.0.0.1:6379> zadd myset 1 one 2 two 3 three 4 four
(integer) 4
//以位置索引从高到低的方式获取并返回此区间内的成员,withscores  就不解释了,上面有
127.0.0.1:6379> zrevrange myset 0 -1 withscores
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
127.0.0.1:6379> zrevrange myset 1 3 //由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> zrevrank myset four  //由于是从高到低的排序,所以four的位置是0
(integer) 0
// 获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序
127.0.0.1:6379> zrevrangebyscore myset 3 0
1) "three"
2) "two"
3) "one"
//该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。
127.0.0.1:6379> zrevrangebyscore myset 4 0 limit 1 2
1) "three"
2) "two"
标签: