初识redis:Zset有序集合

2024-08-26 03:12
文章标签 初识 redis 有序 集合 zset

本文主要是介绍初识redis:Zset有序集合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Set作为集合,有两个特点:唯一且无序。

Zset是有序集合,在保证唯一的情况下,是根据什么来排序的呢?排序的规则是什么?

Zset中的member引入了一个属性,分数(score),浮点类型,每个member都会安排一个分数,进行排序的时候,就是按照此处的分数大小来进行升序、降序的操作。

目录

普通命令

ZADD

ZRANGE

ZCARD

ZCOUNT

ZREVRANGE

ZRANGEBYSCORE

ZPOPMAX  ZPOPMIN

BZPOPMAX  BZPOPMAX

ZRANK   ZREVRANK

ZSCORE

ZREM

ZREMRANGEBYRANK

ZREMRANGEBYRANK

ZINCRBY

集合间操作

交集 ZINTERSTORE

并集 ZUNIONSTOR

Zset应用场景


普通命令

ZADD

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

添加元素的时候,既要添加元素又要添加分数。

不加 XX | NX  的时候,如果当前member不存在,此时就会达到“添加新member”的效果,如果当前member已经存在,此时就会更新分数。

如果元素有相同的分数可以按照元素自身字符串的字典数来排列。

Zset内部是按照升序来排列的。

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

ZRANGE

查询操作,后面加上withscores,可以查询到ZADD添加的分数。

ZCARD

获取一个Zset的基数,即Zset中的元素个数。

ZCOUNT

返回分数在某个区间的元素个数。

ZCOUNT key min max

可以遍历一遍后,就可以知道min和max,但是如果进行遍历,时间复杂度就不是O(logN)了。

实际上,Zset内部会记录每个元素当前的排行(次序),查询到元素就能知道元素所在的次序。

ZREVRANGE

ZRANGE是按照升序来排序,ZREVRANGE则是按照降序来排序。

ZRANGEBYSCORE

按照分数来找元素,通过min max来划分区间。

ZPOPMAX key [count]

ZPOPMAX  ZPOPMIN

删除并返回分数最高(低)的count个元素。

如果存在多个元素分数相同,并且同时为最大(小)值,此时删除的时候仍然只删除一个。

如果分数相同会按照membe字符串的字典序决定先后。

BZPOPMAX  BZPOPMAX

BZPOPMAX key [key ...] timeout

这个命令就是ZPOPMAX的阻塞版本,timeout表示超时时间,表示最多阻塞多久。

ZRANK   ZREVRANK

查询元素的下标(排名)。

 ZRANK得到的下标,是从前往后算的(升序)。ZREVRANK则相反,按照降序。

ZSCORE

查询指定元素的分数。时间复杂度为O(1)。

ZSCORE key member

ZREM

删除指定元素。

ZREM key member [member ...]

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop

对于start和stop区间下标的进行元素删除。

ZREMRANGEBYRANK

ZREMRANGEBYSCORE key min max

对于min和max之间的分数,进行元素删除。

ZINCRBY

ZINCRBY key increment member

ZINCRBY命令会将有序集合中指定成员的分数增加指定的值。

如果成员不存在,它会先创建该成员,然后增加分数。

如果指定的分数增加后为负数,则分数会被设置为 0 。

集合间操作

交集 ZINTERSTORE

ZINTERSTORE 是 Redis 用于合并两个或多个有序集合的命令,并存储结果到一个新的有序集合中。

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

参数

  • destination:存储结果的有序集合的名称。
  • numkeys:参与合并的有序集合的数量。
  • key [key ...]:要合并的有序集合的名称列表。
  • WEIGHTS weight [weight ...]:(可选)每个有序集合的权重列表,用于调整每个集合成员在计算结果时的权重。
  • AGGREGATE:(可选)指定如何合并分数,可以是 SUM(默认)、MIN 或 MAX

可以看到,添加了权重的值,会取权重乘以原集合的值,再取sum添加到新的集合中去。

并集 ZUNIONSTOR

ZUNIONSTOR用法和ZINTERSTORE基本一致。

Zset应用场景

1.微博热搜

2.游戏天梯排行

3.成绩排行

对于zset,很多排行榜的场景,可以用到交集和并集,把一些成绩合并起来,并且通过动态排序来完成。

这篇关于初识redis:Zset有序集合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107386

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长