Redis入门【六】---------有序集合(Sorted Set)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tacks/article/details/82626087

前言

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

情景融入

类似贴吧中回复量最多的前五条记录,如果是关系型数据库,利用select语句按照回帖量顺序然后limit 5条出来就行。但是学习了redis的sort set集合,通过权值排序,去维护这样一个最新记录,它里面只保存五个元素信息,当有新记录回帖插入时候,都会有机会进入这个有序集合,但是按照顺序,回帖量少的信息就会删除,使之有序集合中永远是回复量最多的记录。

下面我先模拟一下,一共有A,B,C,D,E的记录,回复量分别是102,88,200,210,180

那么这五条按照回帖量的从大到小分别是 D,C,E,A,B

信息 回帖量

A

102

B

88

C

200

D

210

E

180

命令操作

【1】有序集合的添加查看

#<1>添加元素到有序集合
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
#<2>获取有序集合的成员数
zcard key
#<3>返回指定区间的成员,分数值递增(从小到大)来排列
zrange key start stop [WITHSCORES]
#<4>返回指定区间的成员,分数值递减(从大到小)来排列
zrevrange key start stop [WITHSCORES]

注意:

zadd可以一次添加多个成员,记住是score在前,成员在后。

zrange后面如果添加WITHSCORES就是返回的时候,连同score一并显示出来。

具体操作

127.0.0.1:6379> zadd  scoreset 102 A
(integer) 1
127.0.0.1:6379> zadd  scoreset 88 B
(integer) 1
127.0.0.1:6379> zadd scoreset 200 C 210 D 180 E   
(integer) 3
127.0.0.1:6379> zcard scoreset
(integer) 5
127.0.0.1:6379> zrange scoreset 0 -1
1) "B"
2) "A"
3) "E"
4) "C"
5) "D"
127.0.0.1:6379> zrevrange scoreset 0 -1
1) "D"
2) "C"
3) "E"
4) "A"
5) "B"

【2】维护这个有序集合

如果这个时候一条信息的回复量很大,插入有序集合的时候,可以用Zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的成员。来保持这个集合中的五条记录

#<5>命令用于移除有序集中,指定排名(rank)区间内的所有成员
zremrangebyrank key start stop
#####################################################
#这个时候插入一条F的记录是300回复量
#具体操作如下
127.0.0.1:6379> zadd scoreset 300 F
(integer) 1
127.0.0.1:6379> zremrangebyrank scoreset 0 0
(integer) 1
127.0.0.1:6379> zrevrange scoreset 0 -1
1) "F"
2) "D"
3) "C"
4) "E"
5) "A"

【3】常用命令

​#<6>返回有序集合中指定成员的索引,从小到大索引
zrank key member
#<7>返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
zrevrank key member
#<8>返回有序集中,成员的分数值
zscore key member
#<9>有序集合中对指定成员的分数加上增量 increment
zincrby key increment member
#<10>移除有序集合中的一个或多个成员
zrem key member [member ...]
#<11>计算在有序集合中指定区间分数的成员数
zcount key min max

​

打个总结

猜你喜欢

转载自blog.csdn.net/Tacks/article/details/82626087