Redis——zset类型详解

这篇具有很好参考价值的文章主要介绍了Redis——zset类型详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

zset是有序集合,将zset中的members引入一个属性score,根据这个属性值来进行排序,其中members不可以重复,score可以重复(按照字典序排序),默认按照升序排序

有序集合中提供指定分数和元素范围查找,计算成员排名功能,一般用于排行榜系统

zset中的member和score并不是键值对的关系,而是pair,既可以通过member找到score,也可以通过score找到member
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

常用命令

zadd

将元素和对应分数插入到有序集合中,时间复杂度O(logN),因为添加的元素要放到指定的位置上来保证有序,默认返回新增成功的元素个数
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
方括号中的内容是代表可选的选项

选项 作用
XX 只更新已经存在的元素,不新插入元素
NX 只插入新的元素,不更新已经存在的元素
不加NX或XX 当前members不存在,则添加新元素,否则更新元素分数
LT 只更新已经存在的元素,并且新的分数比当前的分数小
GT 只更新已经存在的元素,并且新的分数比当前的分数大
CH 如果不添加CH选项,默认返回添加元素的个数,添加CH选项后,加上修改元素的个数
INCR 效果相同于ZINCRBY,将指定元素的score+=指定的值,返回值是更新后score的值

zrange

查看有序集合中指定下标范围的元素详情,从0开始,支持负数(-1就是最后一个元素)

时间复杂度O(log(N) + M),其中logN是根据下标找到边界值,M是遍历区间的开销
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
添加withscores,即可查看members对应的score

示例

Redis——zset类型详解,redis,数据库,redis,数据库,缓存
加入withscores:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
修改操作:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
NX选项:
添加不存在元素:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
NX选项:
更新存在元素(不会生效):
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
XX选项:
更新存在元素的score:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
XX选项:
更新不存在的元素的score(更新失败):
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
CH选项:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
INCR操作:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zcard

获取指定key中元素个数,时间复杂度为O(1)
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zcount

返回指定区间(前闭后闭)内的key中元素的个数,时间复杂度O(logN),(zset内部记录了每个元素的所在次序,logN的时间复杂度找到min和max,然后直接相减次序即可得到元素个数)

min和max支持使用浮点数,inf(无穷大),-inf(负无穷)
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
如果想要排除边界值可以加上括号
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zrevrange

倒序获取指定范围内的元素
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zrangebyscore

根据分数获取指定范围的元素,使用方法和zcount类似
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zpopmax

删除并返回分数最高的count个元素

时间复杂度O(log(N) + M),N是有序集合中元素的个数,M是count的个数
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
如果存在score相同的多个元素,并且都是最大值,那么zpopmax仍然只删除其中的一个元素(按照字典序)
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

bzpopmax

阻塞版本的zpopmax,时间复杂度O(logN),如果传入多个key,只删除其中的一个
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
timeout是超时时间,表示最多阻塞多久,单位是秒,支持小数

演示:
客户端a中的key有序集合中没有元素,进行bzpopmax命令,阻塞等待
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
客户端b插入元素:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
此时,客户端a就可以拿到元素了
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zpopmin

和zpopmax一致,删除有序集合中score最小的元素
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

bzpopmin

和bzpopmax一致,阻塞删除有序集合中最小的元素
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zrank

获取指定元素的排名,时间复杂度O(logN),member不存在返回nil
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zrevrank

按照正序获取member排名
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zscore

返回指定member的score,时间复杂度O(1)
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zrem

删除有序集合中指定的member

时间复杂度O(log(N) * M),N是整个有序序列中元素的个数,M是要删除member的个数

返回删除成功的元素的个数
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zremrangebyrank

根据指定排名范围删除member,前闭后闭,时间复杂度O(logN + M),N是整个集合的member个数,M是区间内的元素个数
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zremrangebyscore

删除指定分数范围内的members,闭区间,可以使用(排除边界值,时间复杂度O(logN + M)
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

zincrby

自增指定的member对应的score,increment为指定自增大小,返回自增后score的大小,支持负数和小数
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

集合操作

操作 描述
zinter 获取两个集合的交集
zinterstore 获取两个集合的交集,将结果保存在另一个key中
zunion 获取两个集合的并集
zunionstore 获取两个集合的并集,将结果保存在另一个key中
zdiff 获取两个集合的差集

其中zinter, zunion, zdiff是Redis 6.2后支持的

zinterstore

语法格式:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

参数名称 作用
destination 结果存储的集合名称
numkeys 几个有序集合参与运算
weights key所占的权重,可以写成小数,最后的总值就是score * 对应的权值
aggregate:sum,min,max 获取总和,最小值,最大值

之所以要有numkeys这个参数,是因为后面还有weight等若干参数,如果没有这个参数无法区分哪些是key哪些是参数

演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
演示aggregate:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
zinterstore的时间复杂度是O(N * K) + O(M * log(M))

N是输入若干有序集合,里面最小的元素的个数

K是有几个有序集合参加运算

M是最终结果的有序集合的元素个数

zunionstore

具体使用与参数和zinterstore类似
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
时间复杂度是O(N) + O(M * log(M))
N是全部元素的个数

演示:
Redis——zset类型详解,redis,数据库,redis,数据库,缓存
Redis——zset类型详解,redis,数据库,redis,数据库,缓存

内部编码方式

情形 编码方式
有序集合中元素个数较少或单个元素提及较小 ziplist压缩列表
有序集合中元素个数较多或单个元素体积很大 skiplist跳表

Redis——zset类型详解,redis,数据库,redis,数据库,缓存
跳表是一种复杂的链表,里面的元素有多个指针,通过精妙的计算可以跳转到指定位置,查询元素的时间复杂度是O(log(N)),相比于树形结构,跳表更适合按照范围获取元素

应用场景

由于Redis的有序列表中自带zrank等获取排名的操作,zincrby等修改score操作。并且根据score的变化,有序列表内部的排行也会变化,因此有序列表一般用来实现排行榜系统

并且,Redis中的zinterstore和zunionstore还支持权重,这对于需要权重来计算排名(例如微博)的场景非常方便文章来源地址https://www.toymoban.com/news/detail-707851.html

到了这里,关于Redis——zset类型详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(53)
  • Redis---数据库和缓存如何保证一致性?

    用「读 + 写」请求的并发的场景来分析: 假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存

    2024年01月24日
    浏览(53)
  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(66)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(47)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道 Redis主从复制是指在Redis中设置一个主节点(Master)和一个或多个从节点(Slave),

    2024年02月15日
    浏览(51)
  • 数据库缓存服务——NoSQL之Redis配置与优化

    目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非关系型数据库产生背景 2.5 总结

    2024年02月15日
    浏览(48)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(54)
  • Redis数据类型(list\set\zset)

    \\\"maybe it\\\'s why\\\"          列表类型是⽤来存储多个 有序 的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个2^32 - 1个元素。在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是

    2024年02月11日
    浏览(41)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(49)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包