Redis教程08(ZSet有序集合介绍)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 上文中介绍了Redis中的Set集合,Set集合是无序的不可重复的。而我们本文要介绍的ZSet其实是在Set的基础上绑定了一个score来实现集合数据按照score排序的集合。Redis教程07(Set集合介绍)有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

上文中介绍了Redis中的Set集合,Set集合是无序的不可重复的。而我们本文要介绍的ZSet其实是在Set的基础上绑定了一个score来实现集合数据按照score排序的集合。


有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

截屏2021-12-01 上午10.36.57.pngZAdd


向有序集合中添加一个或者多个元素(分数/元素),如果元素已经存在,则更新该元素的分数,并调整到对应的位置。按分数从小到大排列

127.0.0.1:6379> zadd student 60 a1 70 a2 80 a3 90 a4
(integer) 4


ZScore


获取有序集合中元素对应的分数值

127.0.0.1:6379> zscore student a1
"60"
127.0.0.1:6379> zscore student a4
"90"


ZRange


获取集合中指定的元素信息,如果加上withscores参数则会连同分数一并返回

127.0.0.1:6379> zrange student 0 -1
1) "a1"
2) "a2"
3) "a3"
4) "a4"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"


ZRevRange

和zrange命令类似,只是结果倒序显示

127.0.0.1:6379> zrevrange student 0 3
1) "a4"
2) "a3"
3) "a2"
4) "a1"
127.0.0.1:6379> zrevrange student 0 3 withscores
1) "a4"
2) "90"
3) "a3"
4) "80"
5) "a2"
6) "70"
7) "a1"
8) "60"


ZCard


返回集合中元素的个数

127.0.0.1:6379> zcard student
(integer) 4


ZCount


统计集合中元素的分数在min和max之间的个数,如果不需要保持min或者max,在其前面加(即可,如下

127.0.0.1:6379> zcount student 60 90
(integer) 4
127.0.0.1:6379> zcount student 60 (90
(integer) 3
127.0.0.1:6379> zcount student (60 90
(integer) 3
127.0.0.1:6379> zcount student (60 (90
(integer) 2


ZRangeByScore


可以根据score范围来查找集合中的元素,加上withscores也可以一并查询出对应的分数。

127.0.0.1:6379> zrangebyscore student 60 90
1) "a1"
2) "a2"
3) "a3"
4) "a4"
127.0.0.1:6379> zrangebyscore student 60 90 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zrangebyscore student (60 (90 withscores
1) "a2"
2) "70"
3) "a3"
4) "80"


ZRank


获取元素在集合中的排名,从小到大排序,最小的排名是0,不存在的返回 nil

127.0.0.1:6379> zrank student a3
(integer) 2
127.0.0.1:6379> zrank student a66
(nil)
127.0.0.1:6379> zrank student a1
(integer) 0


ZRevRank


获取元素在集合中的排名,从大到小排名,和ZRank命令刚好相反

127.0.0.1:6379> zrevrank student a3
(integer) 1
127.0.0.1:6379> zrevrank student a1
(integer) 3


ZIncrBy


给集合中的元素增加分数,如果元素不存在则新建元素,并设置分数初始为0然后在增加设置的分数。

127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "60"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zincrby student 5 a1
"65"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "a1"
2) "65"
3) "a2"
4) "70"
5) "a3"
6) "80"
7) "a4"
8) "90"
127.0.0.1:6379> zincrby student 5 aa
"5"
127.0.0.1:6379> zrange student 0 -1 withscores
 1) "aa"
 2) "5"
 3) "a1"
 4) "65"
 5) "a2"
 6) "70"
 7) "a3"
 8) "80"
 9) "a4"
10) "90"


ZInterStore


计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

127.0.0.1:6379> zadd s1 2 a1 3 a2 4 a3
(integer) 3
127.0.0.1:6379> zadd s2 5 a1 6 a4 7 a3
(integer) 3
127.0.0.1:6379> zinterstore s3 2 s1 s2
(integer) 2
127.0.0.1:6379> zrange s3 0 -1 withscores
1) "a1"
2) "7"
3) "a3"
4) "11"


还可以在命令后跟上权重值,score会乘以该权重值。

127.0.0.1:6379> zinterstore s5 2 s1 s2 weights 3 1
(integer) 2
127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a1"
2) "11"
3) "a3"
4) "19"


ZRem


从集合中弹出一个元素

127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a1"
2) "11"
3) "a3"
4) "19"
127.0.0.1:6379> zrem s5 a1
(integer) 1
127.0.0.1:6379> zrange s5 0 -1 withscores
1) "a3"
2) "19"


ZLexCount


计算有序集合中指定字典区间内成员数量

127.0.0.1:6379> zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f
(integer) 6
127.0.0.1:6379> zlexcount myzset - +
(integer) 6
127.0.0.1:6379> zlexcount myzset [b [e
(integer) 4


注意 -+表示最小值和最大值,如果我们需要通过元素查找的话需要加[。


ZRangeByLex


获取集合中指定成员区间的元素

127.0.0.1:6379> zlexcount myzset1 - +
(integer) 5
127.0.0.1:6379> zlexcount myzset1 [b [e
(integer) 4
127.0.0.1:6379> zrangebylex myzset [b [e
1) "b"
2) "c"
3) "d"
4) "e"


~好了本文到此为止


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
NoSQL Redis 数据安全/隐私保护
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
文章提供了Redis最流行的图形化界面工具Another Redis Desktop Manager的下载及使用教程,包括如何下载、解压、连接Redis服务器以及使用控制台和查看数据类型详细信息。
242 6
Redis 最流行的图形化界面下载及使用超详细教程(带安装包)! redis windows客户端下载
|
3月前
|
NoSQL Redis 数据库
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
文章提供了Redis图形化界面工具的下载及使用教程,包括如何连接本地Redis服务器、操作键值对、查看日志和使用命令行等功能。
225 0
Redis 图形化界面下载及使用超详细教程(带安装包)! redis windows下客户端下载
|
28天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
122 26
|
6月前
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
81 0
|
3月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
135 1
springboot的缓存和redis缓存,入门级别教程
|
3月前
|
存储 NoSQL 关系型数据库
Redis 有序集合(sorted set)
10月更文挑战第17天
121 4
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
2月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
3月前
|
存储 NoSQL Unix
Redis 教程
10月更文挑战第13天
52 0
|
3月前
|
NoSQL 安全 Redis
AWS迁移教程,Redis迁移到Elasticache
AWS迁移教程,Redis迁移到Elasticache