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
\