首页 > 数据库 >详解Redis的Zset类型及相关命令

详解Redis的Zset类型及相关命令

时间:2025-01-22 10:30:28浏览次数:3  
标签:Zset myzset Redis 元素 redis two 详解 integer ZADD

目录

Zset简介

ZADD

ZCARD

ZCOUNT

ZRANGE

ZREVRANGE

ZRANGEBYSCORE

ZPOPMAX

BZPOPMAX

ZPOPMIN

BZPOPMIN

ZRANK

ZREVRANK

ZSCORE

ZREM

ZREMRANGEBYRANK

ZREMRANGEBYSCORE

ZINCRBY

ZINTERSTORE

内部编码

应用场景


Zset简介

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

ZADD

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

语法

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

ZADD 的相关选项:

• XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
• NX:仅⽤于添加新元素,不会更新已经存在的元素。
• CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
• INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

时间复杂度:O(log(N)) 返回值:本次添加成功的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
ZCARD
获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。

语法

ZCARD key
时间复杂度:O(1) 返回值:zset 内的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2
ZCOUNT
返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

语法

ZCOUNT key min max
时间复杂度:O(log(N)) 返回值:满⾜条件的元素列表个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
ZRANGE
返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。

语法

ZRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
ZREVRANGE
返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。

语法

ZREVRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset 2 3
1) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"
ZRANGEBYSCORE
返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

语法

ZRANGEBYSCORE key min max [WITHSCORES]
时间复杂度:O(log(N)+M) 返回值:区间内的元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty array)
ZPOPMAX
删除并返回分数最⾼的 count 个元素。
语法
ZPOPMAX key [count]
时间复杂度:O(log(N) * M) 返回值:分数和元素列表。

举例

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
1) "three"
2) "3"
BZPOPMAX
ZPOPMAX 的阻塞版本。

语法

BZPOPMAX key [key ...] timeout
时间复杂度:O(log(N)) 返回值:元素列表。 举例
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMAX zset1 zset2 0
1) "zset1"
2) "c"
3) "2"
ZPOPMIN
删除并返回分数最低的 count 个元素。
语法
ZPOPMIN key [count]
时间复杂度:O(log(N) * M) 返回值:分数和元素列表。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMIN myzset
1) "one"
2) "1"
BZPOPMIN
ZPOPMIN 的阻塞版本。
语法
BZPOPMIN key [key ...] timeout
时间复杂度:O(log(N)) 返回值:元素列表。 举例
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMIN zset1 zset2 0
1) "zset1"
2) "a"
3) "0"
ZRANK
返回指定元素的排名,升序。
语法
ZRANK key member
时间复杂度:O(log(N)) 返回值:排名。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)
redis> ZRANK myzset "three" WITHSCORE
1) (integer) 2
2) "3"
redis> ZRANK myzset "four" WITHSCORE
(nil)
ZREVRANK
返回指定元素的排名,降序。
语法
ZREVRANK key member
时间复杂度:O(log(N)) 返回值:排名。
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANK myzset "one"
(integer) 2
redis> ZREVRANK myzset "four"
(nil)
redis> ZREVRANK myzset "three" WITHSCORE
1) (integer) 0
2) "3"
redis> ZREVRANK myzset "four" WITHSCORE
(nil)
ZSCORE
返回指定元素的分数。
语法
ZSCORE key member
时间复杂度:O(1) 返回值:分数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"
ZREM
删除指定的元素。
语法
ZREM key member [member ...]
时间复杂度:O(M*log(N)) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
ZREMRANGEBYRANK
按照排序,升序删除指定范围的元素,左闭右闭。
语法
ZREMRANGEBYRANK key start stop
时间复杂度:O(log(N)+M) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
ZREMRANGEBYSCORE
按照分数删除指定范围的元素,左闭右闭。
语法
ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M) 返回值:本次操作删除的元素个数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYSCORE myzset -inf (2
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"
ZINCRBY
为指定的元素的关联分数添加指定的分数值。
语法
ZINCRBY key increment member
时间复杂度:O(log(N)) 返回值:增加后元素的分数。 举例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
ZINTERSTORE
求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
时间复杂度:O(N*K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数. 返回值:⽬标集合中的元素个数。 举例
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"
ZUNIONSTORE
求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数. 返回值:⽬标集合中的元素个数。 举例
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
内部编码
有序集合类型的内部编码有两种:
• ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
• skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。
1)当元素个数较少且每个元素较⼩时,内部编码为 ziplist:
127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3
(integer) 3
127.0.0.1:6379> object encoding zsetkey
"ziplist"
2)当元素个数超过 128 个,内部编码 skiplist:
127.0.0.1:6379> zadd zsetkey 50 e1 60 e2 30 e3 ... 省略 ... 82 e129
(integer) 129
127.0.0.1:6379> object encoding zsetkey
"skiplist"
3)当某个元素⼤于 64 字节时,内部编码 skiplist:
127.0.0.1:6379> zadd zsetkey 50 "one string bigger than 64 bytes ... 省略 ..."
(integer) 1
127.0.0.1:6379> object encoding zsetkey
"skiplist”
应用场景
1.排行榜
Zset非常适合用于实现各种排行榜,如游戏内的玩家排名、社交平台的热门帖子排名等。
元素可以是玩家的ID或帖子的ID,分数可以是玩家的积分或帖子的点赞数、评论数等。
可以使用ZRANGE或ZREVRANGE命令来获取排名前列的元素,或使用ZRANK或ZREVRANK命令来获取特定元素的排名。
2.延时队列
Zset可以用于实现延时队列,其中元素代表任务,分数代表任务的执行时间戳。
通过定期检查Zset中分数最小的元素(即最早应该执行的任务),可以实现任务的定时执行。
当任务执行后,可以从Zset中删除该元素。
欢迎大家访问我的主页---》 链接

标签:Zset,myzset,Redis,元素,redis,two,详解,integer,ZADD
From: https://blog.csdn.net/wmh_1234567/article/details/144493484

相关文章

  • Redis内存淘汰策略
    Redis是一个高性能的键值存储系统,它支持多种数据结构,如字符串、列表、集合、有序集合等。由于Redis是基于内存的存储系统,因此它的速度非常快。然而,内存资源是有限的,当Redis的内存使用量达到一定阈值时,就需要采取一些策略来管理内存,以确保系统的稳定性和性能。这就是Redis......
  • 带 `$` 符号的 Redis 密码在 Flink 调度脚本中被截断的解决方案 WRONGPASS invalid us
    在实际生产使用中,如果你的Redis密码中包含$符号,而你又通过调度脚本(如DolphinScheduler)或Shell参数方式传递给Flink,就可能造成密码被部分截断,进而导致:WRONGPASSinvalidusername-passwordpairoruserisdisabled这是因为Shell解释$为变量展开符,后续字符被当作环......
  • 数据结构 单链表详解
    单链表的基本概念及特点定义:单链表是由一系列节点组成的线性序列,每个节点包含两个部分,一个是存储数据元素的数据域,另一个是指向下一个节点的指针域。最后一个节点的指针域为空(通常用NULL表示),表示链表的结束。特点:1、动态性:单链表的存储空间是在程序运行过程中动态分配......
  • 【超详细】深度学习三杰:CNN、RNN、GNN 全面对比与应用场景详解
    以下是一篇尽可能全面而详尽的博客,围绕卷积神经网络(CNN)、循环神经网络(RNN)、图神经网络(GNN)三大常见深度学习模型进行对比。希望兼顾深度与易读性,同时通过适当的关键词优化来吸引更多流量。深度学习三杰:CNN、RNN、GNN全面对比与应用场景详解导语:在深度学习领域,神经网络种......
  • Redis数据库笔记——ZSet的底层实现(跳表)
    大家好,这里是GoodNote,关注公主号:Goodnote,专栏文章私信限时Free。本文详细介绍ZSet数据类型中跳表的底层实现,包括基本特点和常用操作。文章目录ZSet(有序集合)概述基本特点底层实现Skiplist跳表概述结构跳表的基本操作1.查找操作:`Search`2.插入操作:`Insert`3.删......
  • 关于Redisson分布式锁的用法
    一、前言在分布式系统中,多个节点可能会同时访问共享资源,导致数据不一致的问题。分布式锁是解决这些问题的一种有效机制。Redisson是一个基于Redis的Java客户端,不仅提供了丰富的分布式数据结构,还实现了分布式锁功能。本文将详细介绍Redisson分布式锁的用法,包括其配置、基本用法和......
  • postman接口测试工具详解
    一、前言Postman是一款广泛使用的API测试工具,适用于开发人员和测试人员。它提供了直观的用户界面,能够方便地进行API请求、响应验证、自动化测试等操作。本文将详细介绍Postman的功能和用法,帮助用户高效地进行API测试。二、Postman的主要功能1.发送请求Postman支持多种HTTP方......
  • Redis Stream:实时数据流的处理与存储
    RedisStream是Redis5.0引入的一个强大的数据结构,专门用于处理实时数据流。它类似于ApacheKafka和RabbitMQ等消息队列系统,但集成在Redis这个内存数据库中,使得Redis不仅能处理缓存和存储,还能高效地处理实时数据流。本文将深入探讨RedisStream的特性、使用方法以及......
  • 详解TCP协议
    TCP协议全称为传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。与UDP协议最大的不同是,其会保证消息传输的可靠性。TCP协议格式源端口:标识发送进程。目的端口:标识目的进程32位序号:标识从TCP发送端向TCP接收端发送的数据字节流,表示报文段中的第一个......
  • Redis的三大常见问题
    Redis的三大常见问题如果是一名能够熟练的将Redis运用到项目中的程序员,那么一定听说过Redis在使用中存在的问题,那么我们今天就来聊聊Redis的三大问题为什么会有三大问题?首先,对于很多刚接触Redis的同学,很多时候分不清Redis的作用,不太理解为什么要在SQL之外单独在搞一个Red......