首页 > 其他分享 >Zset有序集合

Zset有序集合

时间:2024-03-24 17:32:53浏览次数:19  
标签:127.0 有序 Zset 0.1 元素 6379 withscores key 集合

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,使用分数作为排序依据。
有序集合中的元素是不能重复的,但分数允许重复。

普通命令

zadd

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是可以的。
语法:

ZADD key [NX | XX] [CH] [INCR] score member [score member
 ...]
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • INCR:将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
    时间复杂度:O(log(N))
    返回值:本次添加成功的元素个数。
127.0.0.1:6379> zadd key 67 zcx
1
127.0.0.1:6379> zadd key ch  85 zcx
1
127.0.0.1:6379> zadd key incr 10 zcx
77

zcard

获取zset中的元素个数。
语法:

zcard key

时间复杂度:O(1)
返回值:zset 内的元素个数。

127.0.0.1:6379> zadd key 99 zcx 66 lisi 
1
127.0.0.1:6379> zcard key
2

zcount

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:

ZCOUNT key min max

时间复杂度:O(log(N))
返回值:满⾜条件的元素列表个数。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
li
99
zcx
99
127.0.0.1:6379> zcount key 60 89
3
127.0.0.1:6379> zcount key 60 (89
2

zrange

按照升序,返回指定区间里的元素。
语法:

zrange key start stop [withscores]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
li
99
zcx
99

zrevrange

返回指定区间⾥的元素,分数按照降序。
语法:

ZREVRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrevrange key 0 -1 withscores
zcx
99
li
99
ta
89
lisi
66
ko
66

ZRANGEBYSCORE

返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:

 ZRANGEBYSCORE key min max [WITHSCORES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrangebyscore key 60 90
ko
lisi
ta
127.0.0.1:6379> zrangebyscore key 60 90 withscores
ko
66
lisi
66
ta
89

zpopmax

删除并返回分数最⾼的 count 个元素。
语法:

ZPOPMAX key [count]

时间复杂度:O(log(N) * M)
返回值:分数和元素列表。

127.0.0.1:6379> zpopmax key 2
zcx
99
li
99
127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89

bzpopmax

ZPOPMAX 的阻塞版本,查找的key中没有value就会阻塞等待。
语法:

BZPOPMAX key [key ...] timeout

时间复杂度:O(log(N))
返回值:元素列表。

127.0.0.1:6379> bzpopmax key1 90

127.0.0.1:6379> zadd key1 90 zan
(integer) 1

zan
90

zpopmin

删除并返回分数最低的 count 个元素。
语法:

 ZPOPMIN key [count]

时间复杂度:O(log(N) * M)
返回值:分数和元素列表。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
127.0.0.1:6379> zpopmin key 2
ko
66
lisi
66

bzpopmin

ZPOPMIN 的阻塞版本。
语法:

BZPOPMIN key [key ...] timeout

时间复杂度:O(log(N))
返回值:元素列表。

127.0.0.1:6379> bzpopmin key1 100

127.0.0.1:6379> zadd key1 60 zcx
(integer) 1

key1
zcx
60

zrank

返回指定元素的排名,升序。
语法:

ZRANK key member

时间复杂度:O(log(N))
返回值:排名。

127.0.0.1:6379> zrange key 0 -1 withscores
z
56
c
77
x
78
s
89
q
90
127.0.0.1:6379> zrank key x
2

zrevrank

返回指定元素的排名,降序。
语法:

ZREVRANK key member

时间复杂度:O(log(N))
返回值:排名。

127.0.0.1:6379> zrange key 0 -1 withscores
z
56
c
77
x
78
s
89
q
90
127.0.0.1:6379> zrevrank key q
0
127.0.0.1:6379> zrevrank key s
1

zscore

返回指定元素的分数。
语法:

ZSCORE key member

时间复杂度:O(1)
返回值:分数。

127.0.0.1:6379> zscore key q
90
127.0.0.1:6379> zscore key x
78

zrem

删除指定的元素。
语法:

ZREM key member [member ...]

时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrem key z c x
3
127.0.0.1:6379> zrange key 0 -1 withscores
s
89
q
90

zremrangebyrank

按照顺序删除指定区间元素。
语法:

zremrangebyrank  key star stop

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrange key 0 -1 withscores
s
89
q
90
127.0.0.1:6379> zremrangebyrank key 0 1
2
127.0.0.1:6379> zrange key 0 -1 withscores


zremrangebyscore

按照分数删除指定区间元素。
语法:

zremrangebyscore key min max

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrange key 0 -1 withscores
q
45
w
48
e
67
r
78
c
87
t
98
127.0.0.1:6379> zremrangebyscore key 30 80
4
127.0.0.1:6379> zrange key 0 -1 withscores
c
87
t
98

zincrby

为指定的元素的关联分数添加指定的分数值。
语法:

ZINCRBY key increment member

时间复杂度:O(log(N))
返回值:增加后元素的分数。

127.0.0.1:6379> zrange key 0 -1 withscores
c
87
t
98
127.0.0.1:6379> zincrby key 13 c
100
127.0.0.1:6379> zrange key 0 -1 withscores
t
98
c
100

集合间操作

zinterstore

求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
 [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

时间复杂度:O(N * K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

127.0.0.1:6379> zadd key 44 q 55 w 66 e 77 r 88 t 99 y
6
127.0.0.1:6379> zadd key1 11 q 22 w 33 e
3
127.0.0.1:6379> zinterstore key2  2 key key1 weights 2 3
3
127.0.0.1:6379> zrange key2 0 -1 withscores
q
121
w
176
e
231
127.0.0.1:6379> zunionstore key4 2 key key1 aggregate sum 
(integer) 6
127.0.0.1:6379> zrange key4 0 -1 withscores
 1) "q"
 2) "55"
 3) "r"
 4) "77"
 5) "w"
 6) "77"
 7) "t"
 8) "88"
 9) "e"
10) "99"
11) "y"
12) "99"

zunionstroe

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
 [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

127.0.0.1:6379> zadd key 44 q 55 w 66 e 77 r 88 t 99 y
6
127.0.0.1:6379> zadd key1 11 q 22 w 33 e
3
127.0.0.1:6379> zunionstore key3 2 key key1 weights 2 2
6
127.0.0.1:6379> zrange key3 0 -1 withscores
q
110
r
154
w
154
t
176
e
198
y
198

内部编码

有序集合类型的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
  • skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。

标签:127.0,有序,Zset,0.1,元素,6379,withscores,key,集合
From: https://blog.csdn.net/st200112266/article/details/136976094

相关文章

  • Set集合命令
    集合类型也是保存多个字符串类型的元素的,元素之间是无序的且不能重复。Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。普通命令sadd将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添......
  • 卡码java基础课 | 17.判断集合成员
    学习内容:set的概念和特点set的基本操作,比如创建、插入、删除、查找HashSet的常用方法Set集合的遍历迭代器重点归纳:set本质上是一种集合接口,类似于数学中的集合,常用于存储一组元素,用来判断一种元素是否在集合中。Set接口的常见实现类包括HashSet、TreeSet和LinkedHashSet......
  • MQ集合了
    消息队列,FIFO :异步 解耦  削峰复杂度上升幂等重复消费消息丢失/可用性降低mq故障/一致性要求mq对比: activeMQ:jms规范,支持事务xa协议  rabbitMQ:erlang性能......
  • 【面试】高并发中的集合
    本文旨在总结多线程情况下集合的使用Java中的集合大致以下三个时期:第一代线程安全集合类以Vector、HashTable为代表的初代集合,使用synchronized在修饰方法,从而保证线程安全。缺点:效率低。代码示例Vectoradd方法源码/***Appendsthespecifiedelementtotheendoft......
  • Java学习笔记:ArrayList集合
    目录为什么要有集合:解决数组自动扩容的问题Java、python数据类型对比Java支持的数据类型主要分为两大类:Python支持多种数据类型,主要包括以下几种:在Java中常见的数据类型实现方式:Java通过使用集合框架来解决一组数据的存储和管理Java集合大致也可分成List、Set、Queue、Map四种接口......
  • P1466 [USACO2.2] 集合 Subset Sums
    题目传送门:P1466[USACO2.2]集合SubsetSums-洛谷|计算机科学教育新生态(luogu.com.cn)https://www.luogu.com.cn/problem/P1466//https://www.luogu.com.cn/problem/P1466//背包#include<bits/stdc++.h>usingnamespacestd;intval[40],f[40][1005];//f[i][......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......
  • Java之集合
    一.List        存取有序,可以存储重复的元素,可以用下标进行元素的操作1.ArrayList        在Java数组中,长度是固定的,因此在数组被创建后,不能修改长度,这意味着开发者需要实现知道数组的长度。但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,Ar......
  • 添加区间到集合中,并计算出现在至少一个区间中的整数个数
    Leetcode题目:不断地添加区间到区间集合中,并计算出现在至少一个区间中的整数个数。使用BTreemap动态开区间。usestd::collections::BTreeMap;structCountIntervals{mp:BTreeMap<i32,i32>,cnt:i32,}implCountIntervals{fnnew()->Self{C......
  • 非有序数组也能二分? —— 红蓝染色法续篇(Leetcode 162.寻找峰值)
    1.写在前面本文为个人学习总结,参考:B站Up:灵茶山艾府参考视频链接:https://www.bilibili.com/video/BV1QK411d76w/2.题目我们来看一下下面这道题:峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在......