Redis-技术专区-让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】
前言介绍
很多小伙伴都跟我说,redis中,ZSet(有序集合)是他们最陌生的集合,同时也是觉得特别复杂的集合之一,在开发过程中经常会用到它,而且也是大家最不太有把握使用的集合,所以笔者就从ZSet集合开始去讲解Redis的集合的使用指南,希望可以帮助大家!
有序集合
ZSET(有序集合)的概念
有序集合(ZSET):是像集合(SET)一样可以装很多东西,只不过集合装的是字符串而有序集合(ZSET)装的是键值对,从更严谨的角度讲,有序集合和散列更接近。只不过有序集合是有序的,有点像TreeSet。
ZSET(有序集合)的定义
有序集合(ZSet):它是一个存储着成员(member)本身对象值以及和它对应的分值(score)的键值对,并且按照分值从小到大自动排序。对应的具体的数据结构,
- 有序集合的键被称为成员(member)每个成员各不相同
- 有序集合的值被称为分值(score),分值必须是浮点数
ZADD命令:
它的全称叫做:zset add,将给定分值的成员添加到有序集合里面
因为有序集合是自排序的,所以也不像列表一样有左插入或右插入
指令:
# zadd key score value
zadd zset-weight 60 Kelvin
java代码
System.out.println(conn.zadd("zset-weight",60,"Kelvin"));
作用
往zset-weight这个有序集合中添加Kelvin-60这个键值对
返回
- “1” 存入成功
- “0” 存入失败,zset-weight已经存在该键值对
注意
有序集合的不一样的地方就在于,将分值写在前面,因为有序集合是要根据分值来进行排序的,默认从小到大(正序 ASC)
其他案例
zadd zset-weight 40 Lina
zadd zset-weight 50 Oscar
zadd zset-weight 70 Mike
执行完了存储,我们接下来,如何删除元素?
ZREM(移除)
ZREM全称zset remove,从有序集合里面移除给定的成员,并返回被移除成员的数量
指令
zrem zset-weight Mike
- 作用:移除zset-weight中键为Mike的元素
- 返回:"1" 表示移除元素数量为1
System.out.println(conn.zrem("zset-weight","Mike"));
ZCARD
ZCARD全称zset card,返回有序集合包含的成员数量
指令
zcard high
java代码
System.out.println(conn.zadd("high",180,"Kelvin"));
System.out.println(conn.zadd("high",160,"Lina"));
System.out.println(conn.zadd("high",177,"Mike"));
System.out.println(conn.zcard("high"));
zcard命令返回3.
ZINCRBY
ZINCRBY全称zset increase by,将成员的分值加上一个给定数。
System.out.println(conn.zincrby("high",2,"Kelvin"));
ZCOUNT
ZCOUNT全称zset count,返回分值在[min,max]之间的成员数量
System.out.println(conn.zcount("high",165,190));
ZRANK
ZRANK全称zset rank,返回成员在有序集合中的排名
System.out.println(conn.zrank("high","Kelvin"));
ZSCORE
ZSCORE全称zset score,返回成员的分值
System.out.println(conn.zscore("high","Kelvin"));
ZRANGE(获取)
ZRANGE全称:zset range key start end [WITHSCORES] ,取出zset-weight中索引值在[start,end]之间的成员,即该范围内的键值对,如果给定了可选WITHSCORES的选项,那么命令会将成员的分值也一并返回。
如果希望全部取出来,可以采用start=0,end=-1,可以看出来是一个环路,前开后闭。如果start选择了1,就无法获取第一个,拿出来的数据会少一个!而end=-1 则则说明获取到最后一个
指令:
zrange key start end withscores
zrange zset-weight 0 -1 withscores
返回
(1)"Lina"
(2)"40"
(3)"Oscar"
(4)"50"
(5)"Kelvin"
(6)"60"
(7)"Mike"
(8)"70"
我们现在选择选出排名第3到第6之间的数据,(3,6]
System.out.println(conn.zrange("high",3,6));
因为zrange的范围是左开右闭,那么如果我们想拿到(3,6]并且拿到这些的分值。
System.out.println(conn.zrangeWithScores("high",3,6));
ZRANGEBYSCORE
ZRANGEBYSCORE全称zset range by score,它与zrange相比较区别在于根据分值范围来获取,返回有序集合中分值介于min和max之间的所有成员
需求场景
我们挑出分值在160到180之间的成员
指令
zrangebyscore key start end [withscores]
zrangebyscore zset-weight 160 180 withscores
java代码
System.out.println(conn.zrangeByScore("high",160,180));
作用
取出分值在[0,60]之间的键值对
返回
(1)"Lina"
(2)"40"
(3)"Oscar"
(4)"50"
(5)"Kelvin"
(6)"60"
ZREVRANGE
ZREVRANGE全称zset reverse range,返回有序集合给定排名范围内的成员,成员按照分值从大到小排列
指令
zrevrange key start end withscores
zrevrange zset-weight 0 -1 withscores
java代码
System.out.println(conn.zrevrange("high",1,5));
ZREVRANGEBYSCORE
ZREVRANGEBYSCORE全称·
zset reversal range by score,获取有序集合中分值介于min和max之间的所有成员,并按照分值从大到小的顺序来返回。
指令
倒序获取160到180 的位置,注意此时 180 是开始坐标 160是结束坐标
zrevrangebyscore key start end
zrevrangebyscore high 180 160
Java代码
System.out.println(conn.zrevrangeByScore("high",180,160));
ZREVRANK
ZREVRANK全称zset reversal rank,返回成员在有序集合里的排名,按照分值从大到小排列,默认的是从小到大,这里翻转了一下。
假设,“Kelvin”排第6,“Yellow”排第3,但是从逆向来看,“Kelvin”为0,“Yellow”为3,那么我们写行代码查看一下。
System.out.println(conn.zrevrank("high","Yellow"));
System.out.println(conn.zrevrank("high","Kelvin"));
ZREMRANGEBYRANK
ZREMRANGEBYRANK全称zset remove range by rank,移除有序集合中排名介于start和stop之间的所有成员
在移除之间先查看一下redis中的数据
运行Java代码
System.out.println(conn.zremrangeByRank("high",2,4));
返回被移除的数量
ZREMRANGENYSCORE
ZREMRANGEBYSCORE全称zset remove range by score移除有序集合中排名分值介于start和stop之间的所有成员
为了演示方便,我们将在high有序集合中多添加几行数据
System.out.println(conn.zadd("high",174,"Jay"));
System.out.println(conn.zadd("high",169,"Pei"));
System.out.println(conn.zadd("high",186,"Jone"));
然后移除分值170以内的成员
System.out.println(conn.zremrangeByScore("high",0,170));
ZINTERSTORE
ZINTERSTORE全称zset inter store,对给定的有序集合做交集运算,默认使用的聚合函数为sum,即默认在做交集操作时将不同集合中相同的成员所对应的分值相加,然后聚合成一个新的有序集合。
ZUNIONSTORE
ZUNIONSTORE全称zset union store,对给定的有序集合做并集运算,同样并集运算的聚合函数也可以选用“max”,"min"和“sum”。为了避免重复性说明,我们选用max来做一次并集示范。
Redis-技术专区-让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】的更多相关文章
- 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法
"为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...
- 分布式-技术专区-Redis并发竞争key的解决方案详解
Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争.这里的并发指的是多个redis的clie ...
- 分布式-技术专区-Redis和MySQL缓存一致性问题
1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...
- Redis技术
Redis技术 Redis 简介 Redis 是一个 key-value 的 nosql 产品,存储的 value 类型更加丰富,包括 string(字符串), list(链表),set(集合),zs ...
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...
- Redis技术分享
环境介绍: 开发环境: spring3+tomcat7+maven3+redis-3.0.7 运行环境: Linux 前言: 项目中引入redis背景: 项目中最初将科目.打印.利润表.资产负债表.现 ...
- Redis简介以及如何在Windows上安装Redis
Redis简介 Redis是一个速度非常快的非关系型内存数据库. Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erla ...
- 基于 redis 的分布式锁实现 Distributed locks with Redis debug 排查错误
小结: 1. 锁的实现方式,按照应用的实现架构,可能会有以下几种类型: 如果处理程序是单进程多线程的,在 python下,就可以使用 threading 模块的 Lock 对象来限制对共享变量的同步访 ...
- redis集群与分片(1)-redis服务器集群、客户端分片
下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型 ...
随机推荐
- ECMAScript 2020(ES11)新特性简介
目录 简介 动态imports import.meta export加强 BigInt matchAll() globalThis Promise.allSettled() ??操作符 ?.操作符 总 ...
- 阿里钉钉Android实习面试也太太太太难了吧,对算法的要求堪比字节
本人研究生在读,在2月26日找了师兄内推阿里钉钉团队,28号接到了约1面的电话.幸好我提前准备了一个多月的样子,刷面试题.刷LeetCode(面了之后才觉得自己刷少了),对于我这样一个实习生来说题目还 ...
- .jsp文件的使用和理解以及一些小练习和Listener监听器
什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...
- JAVA基础语法:函数(方法)、类和对象(转载)
4.JAVA基础语法:函数(方法).类和对象 函数 在java中函数也称为方法,是一段具备某种功能的可重用代码块. 一个函数包括这几部分: 函数头 函数头包括函数访问修饰符,函数返回值类型, 函数名, ...
- rancher2.2.2搭建pipeline
1.通过docker容器安装gitlab代码库 docker run --detach \--hostname 192.168.102.62 \ --env GITLAB_OMNIBUS_CONFIG ...
- 跟我一起写 Makefile(四)
书写规则 ---- 规则包含两个部分,一个是依赖关系,一个是生成目标的方法. 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出 ...
- moco模拟接口具体操作
1.get请求 [ { "description": "模拟一个没有参数的get请求", "request": { "uri&qu ...
- QZHWTEST2021.5.23分析
树上游戏 题面 题目描述 \(FLY\)和朋友玩一个游戏. 在一棵树上,每个点都有一个点权,\(FLY\)和朋友从根开始,轮流取出点权作为分值,并且由当前玩家选择前往哪一个儿子,直到到达叶子节点后计算 ...
- DVWA-sql注入(盲注)
DVWA简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...
- Mysql使用存储过程快速添加百万数据
前言 为了体现不加索引和添加索引的区别,需要使用百万级的数据,但是百万数据的表,如果使用一条条添加,特别繁琐又麻烦,这里使用存储过程快速添加数据,用时大概4个小时. 创建一个用户表 CREATE TA ...