Redis(八)—— Zset 有序集合类型详解

Zset 有序集合

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

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

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

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

常用命令

将一个或多个成员元素及其分数值加入到有序集当中:zadd

如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。

分数值相同,元素可以不同

分数值可以是整数值或双精度浮点数。

如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。

当 key 存在但不是有序集类型时,返回一个错误。

返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

查看有序集中的内容:zrange

 #==============================将一个成员元素及其分数值加入到有序集当中==============================
 127.0.0.1:6379> zadd myset 1 one  
 (integer) 1
 #==============================查看有序集中指定位置的元素==============================
 127.0.0.1:6379> zrange myset 0 1
 1) "one"
 #==============================将多个成员元素及其分数值加入到有序集当中==============================
 127.0.0.1:6379> zadd myset 2 two 3 three
 (integer) 2
 #==============================查看有序集中所有的元素==============================
 127.0.0.1:6379> zrange myset 0 -1
 1) "one"
 2) "two"
 3) "three"
 #==============================查看有序集中所有的元素及对应的分数值==============================
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 #==============================分数值相同,元素可以不同==============================
 127.0.0.1:6379> zadd myset 1 hello
 (integer) 1
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "hello"
 2) "1"
 3) "one"
 4) "1"
 5) "two"
 6) "2"
 7) "three"
 8) "3"
 #==============================更新hello元素的分数值为4==============================
 127.0.0.1:6379> zadd myset 4 hello
 (integer) 0
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "hello"
 8) "4"

按顺序查询有序集中的元素:ZRANGEBYSCORE(从小到大),ZREVRANGEBYSCORE(从大到小)

可选参数:WITHSCORES,会返回元素和其分数

 127.0.0.1:6379> zadd salary 1000 wanli 2000 shenming 3000 rumian 5000 fuxi
 (integer) 4
 127.0.0.1:6379> zrange salary 0 -1 withscores  #员工工资情况
 1) "wanli"
 2) "1000"
 3) "shenming"
 4) "2000"
 5) "rumian"
 6) "3000"
 7) "fuxi"
 8) "5000"
 #==============================按从小到大顺序查看员工工资==============================
 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
 1) "wanli"
 2) "1000"
 3) "shenming"
 4) "2000"
 5) "rumian"
 6) "3000"
 7) "fuxi"
 8) "5000"
 #==============================按从大到小顺序查看员工工资==============================
 127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf withscores
 1) "fuxi"
 2) "5000"
 3) "rumian"
 4) "3000"
 5) "shenming"
 6) "2000"
 7) "wanli"
 8) "1000"
 #==============================显示工资 <=3000 的所有成员==============================
 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 3000 WITHSCORES
 1) "wanli"
 2) "1000"
 3) "shenming"
 4) "2000"
 5) "rumian"
 6) "3000"
 #==============================显示工资 >=3000 的所有成员==============================
 127.0.0.1:6379> ZRANGEBYSCORE salary 3000 +inf WITHSCORES
 1) "rumian"
 2) "3000"
 3) "fuxi"
 4) "5000"
 #==============================(2000 4000:显示工资大于2000,小于等于4000的所有成员                                                        2000 (4000:显示工资大于等于2000,小于4000的所有成员 =======================                                  
 127.0.0.1:6379> ZRANGEBYSCORE salary (2000 4000 withscores
 1) "rumian"
 2) "3000"
 ​

移除有序集中的一个或多个元素,不存在的元素将被忽略:zrem

返回值:被成功移除的元素的数量,不包括被忽略的元素。

 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "hello"
 8) "4"
 #==============================移除单个元素==============================
 127.0.0.1:6379> zrem myset one
 (integer) 1
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "two"
 2) "2"
 3) "three"
 4) "3"
 5) "hello"
 6) "4"
 #==============================移除多个元素==============================
 127.0.0.1:6379> zrem myset two three
 (integer) 2
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "hello"
 2) "4"

计算集合中元素的数量:zcard

 127.0.0.1:6379> zcard salary
 (integer) 4

计算有序集合中指定分数区间的成员数量:zcount

 127.0.0.1:6379> zadd myset 1 one 2 two 3 three 4 four
 (integer) 4
 127.0.0.1:6379> zrange myset 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 #==============================分数区间[1,3]的元素个数==============================
 127.0.0.1:6379> zcount myset 1 3
 (integer) 3

更多命令请参考:https://redis.io/commands

\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

万里顾—程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值