redis的第5种数据结构——zset
mhr18 2024-11-26 12:00 18 浏览 0 评论
前面几篇文章写了redis的4种数据结构——string / hash / list / set, 今天介绍下最后一种数据结构 zset。
zset 和 set 的不同之处是,zset多了一个score
zset的命令都是以Z开头
1.添加/更新 zadd key [nx|xx] [ch] [incr] score member …
默认情况下的返回值:成功添加的新成员的数量
> zadd z1 77 tom 90 mike 60 michael
(integer) 3
如果有序集合中已经存在score和member都相同的元素,不能添加:
> zadd z1 77 tom
(integer) 0
可以添加score一样的不同member:
> zadd z1 60 tony
(integer) 1
如果添加的member已存在,但是score不同,就更新score:
> zadd z1 88 tom
(integer) 0
Tom的score已从77更新到了88
更新member的score,不算新增,所以返回值是0
上面更新了返回的也是0,感觉怪怪的。
我想让他的返回值是元素改变的数量(也包括新增在内)怎么搞?
——CH:
> zadd z1 ch 87 tom
(integer) 1
如果我只想添加新元素,
对于已经存在的member,不要更新它的score,怎么搞?——NX
> zadd z1 nx ch 11 tom
(integer) 0
如果只想更新已存在的member的score,
对于不存在的member,不要新增,怎么搞?——XX
> zadd z1 xx ch 22 jerry
(integer) 0
INCR—— 功能同zincrby相同(下面)
> zadd z1 ch incr 6 tony
"66"
Tony的score从 60 更新成了 66
2.升序查看 zrange key start stop [withscores]
返回的结果是按score升序排列的:
> zrange z1 0 -1
1) "michael"
2) "tony"
3) "tom"
4) "mike"
> zrange z1 1 2
1) "tony"
2) "tom"
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tony"
4) "66"
5) "tom"
6) "87"
7) "mike"
8) "90"
3.降序查看 zrevrange key start stop [withscores]
> zrevrange z1 0 -1 withscores
1) "mike"
2) "90"
3) "tom"
4) "87"
5) "tony"
6) "66"
7) "michael"
8) "60"
4.查看member排名(升序) zrank key member
> zrank z1 tom
(integer) 2 排名第三
5.查看member排名(降序) zrevrank key member
> zrevrank z1 tom
(integer) 1 排名第二
6.查看指定score范围内的元素(升序排列)
zrangebyscore key min max [withscores] [limit offset count]
> zrangebyscore z1 60 87
1) "michael"
2) "tony"
3) "tom"
> zrangebyscore z1 60 87 withscores
1) "michael"
2) "60"
3) "tony"
4) "66"
5) "tom"
6) "87"
score在0~88之间的结果,偏移1位,取1位
> zrangebyscore z1 60 87 withscores limit 1 1
1) "tony"
2) "66"
7.查看指定score范围内的元素(降序排列)
zrevrangebyscore key max min [withscores] [limit offset count]
> zrevrangebyscore z1 87 60
1) "tom"
2) "tony"
3) "michael"
8.查看有序集合内元素个数 zcard key
> zcard z1
(integer) 4
9.查看有序集合内 member的score
> zscore z1 tony
"66"
10.增加member的score zincrby key increment member
> zincrby z1 10 tony
"76"
> zscore z1 tony
"76"
11.查看指定score范围内的元素个数 zcount key min max
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tony"
4) "76"
5) "tom"
6) "87"
7) "mike"
8) "90"
> zcount z1 70 90
(integer) 3
12.删除指定元素 zrem key member …
> zrem z1 tony
(integer) 1
> zrange z1 0 -1
1) "michael"
2) "tom"
3) "mike"
13.删除指定排名内的元素 zremrangebyrank key start stop
删除(升序)排名最后的一个元素
> zremrangebyrank z1 -1 -1
(integer) 1
> zrange z1 0 -1
1) "michael"
2) "tom"
14.删除指定score范围内的元素 zremrangebyscore key min max
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
3) "tom"
4) "87"
> zremrangebyscore z1 80 89
(integer) 1
> zrange z1 0 -1 withscores
1) "michael"
2) "60"
15.zinterstore destination numkeys key… [weights…] [aggregate sum|min|max]
将numkeys个集合取交集 score*weight后 求和/取最小值/取最大值,weight默认为1 aggregate默认为sum
这里就用官网上的例子演示了:
先造一些数据,三个同学的半期考试成绩:
> zrange mid_test 0 -1 withscores
1) "Han Meimei"
2) "70"
3) "Li Lei"
4) "70"
5) "Tom"
6) "99.5"
期末考试成绩:
> Zrange fin_test 0 -1 withscores
1) "Han Meimei"
2) "75"
3) "Li Lei"
4) "88"
5) "Tom"
6) "99.5"
半期考试成绩和期末考试成绩相加
> zinterstore sumstore1 2 mid_test fin_test
(integer) 3
> zrange sumstore1 0 -1 withscores
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
期末考试的占比更大,将期末成绩*2再加上半期成绩:
> zinterstore sumstore2 2 mid_test fin_test weights 1 2
(integer) 3
> zrange sumstore2 0 -1 withscores
1) "Han Meimei"
2) "220"
3) "Li Lei"
4) "246"
5) "Tom"
6) "298.5"
查看他们2次考试的最高分:
> zinterstore maxstore3 2 mid_test fin_test aggregate max
(integer) 3
> zrange maxstore3 0 -1 withscores
1) "Han Meimei"
2) "75"
3) "Li Lei"
4) "88"
5) "Tom"
6) "99.5"
16.zunionstore destination numkeys key… [weights…] [aggregate sum|min|max]
将numkeys个集合取并集 score*weight后 求和/取最小值/取最大值 weight默认为1 aggregate默认为sum
造一组打工人的工资数据:
> zrange worker 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
再造一组 合伙人老板的工资数据(Tom既是员工,也是老板):
> zrange boss 0 -1 withscores
1) "tom"
2) "5500"
3) "bob"
4) "6000"
看看这个月大家工资多少:
> zunionstore salary 2 worker boss
(integer) 4
> zrange salary 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "bob"
6) "6000"
7) "tom"
8) "10500"
Tom既是员工,也是老板 领2份工资,最高
第二个月,老板熬鸡汤:做员工的不努力,老板就过不上想要的生活,听懂掌声。。。
打工人996,老板终于涨薪了。。。
> zunionstore salary2 2 worker boss weights 1 2
(integer) 4
> zrange salary2 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "bob"
6) "12000"
7) "tom"
8) "16000"
老板工资翻倍,员工工资不变。。。
看谁的工资最高(Tom 双重身份的例子,在这里不合适,理解意思即可):
> zunionstore salary3 2 worker boss aggregate max
(integer) 4
> zrange salary3 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5500"
7) "bob"
8) "6000"
17. zrangebylex key min max [limit offset count]
当有序集合的所有成员都具有相同的分值时(score必须相同,不然返回的结果不准确),
有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员
范围和数学中的范围表示方式有点类似:
+ 表示正无限, - 表示负无限,[表示闭区间,(表示开区间
> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
18. zlexcount key min max
这个的使用前提和zrangebylex一样,都是score相同的有序集合。
zrangebylex是取范围内的集合,zlexcount是统计个数
> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
> ZADD myzset 0 f 0 g
(integer) 2
> ZLEXCOUNT myzset - +
(integer) 7
> ZLEXCOUNT myzset [b [f
(integer) 5
19.zremrangebylex key min max
和上面类似,这个是删除范围内的元素
> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"
- 上一篇:redis知识整理-持久化
- 下一篇:面试官:请你说下单线程的redis为什么这么快
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)