Redis 有序集合(Zsets) 复习

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收

介绍

sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。

应用场景

主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等

专有名词区分

需注意有序集合中 排名分数索引字典 等词区分。

字典 相当于集合中的元素,也是说 分数下面的

其中 排名 就是根据 分数从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名

命令大纲

新增(ZADD、ZINCRBY)

添加一个或多个成员,或者更新成员的分数(ZADD)

# NX|XX 仅更新存在的成员,不添加新成员| 不更新存在的成员,只添加新成员
# GT|LT 更新新的分值比当前分值小的成员,不存在则新增| 更新新的分值比当前分值大的成员,不存在则新增 (6.2版本添加)
# CH 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内
注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
# INCR ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对
注意: GT, LT 和 NX 三者互斥不能同时使用。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

CH 是默认自带

返回值

> ZADD zsets1 1 php 2 java 3 python 4 c++
(integer) 4

对指定成员的分数加上增量 (ZINCRBY)

# increment 增量
ZINCRBY key increment member

返回值

> ZINCRBY zsets1 12 php
"14"

查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)

获取有序集合的成员数(ZCARD)

ZCARD key

返回值

> ZCARD zsets1
(integer) 6

计算在有序集合中指定区间分数的成员数(ZCOUNT)

# min 最大分数 max 最小分数
ZCOUNT key min max

返回值

> ZCOUNT zsets1 0 100
(integer) 6

获取值的区间内成员数量(ZLEXCOUNT)

ZLEXCOUNT key min max

注意:此处是值,并不是分数

返回值

> ZLEXCOUNT zsets4 [a [z
(integer) 8
> 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"

通过索引区间返回有序集合指定区间内的成员(ZRANGE)

# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]

返回值

> ZRANGE  zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c++"
6) "c"

通过分数返回区间内的成员(ZRANGEBYSCORE)

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

在分数中 ( 是不带等于 如:(5 (10 = 5<score<10; (5 [10= 5<score<=10;

返回值

# 显示分数0到100(不包括100)
> ZRANGEBYSCORE zsets4 0 (100 
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
# 全显示
> ZRANGEBYSCORE zsets4 -inf +inf
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
# 从索引1开始取5条数据
> ZRANGEBYSCORE zsets4 -inf +inf limit 1 5
1) "java"
2) "py"
3) "python"
4) "ruby"
5) "c"

指定成员的排名(ZREVRANK)【分数值递减(从大到小)排序】

ZREVRANK key member

注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几

返回值

> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREVRANK zsets1 c++
(integer) 2

查找成员的分数值(ZSCORE)

ZSCORE key member

返回值

> ZSCORE zsets1 java
"2"

返回指定成员的排名(ZRANK)

ZRANK key member

返回值

> ZRANK zsets1 java
(integer) 1
> ZRANK zsets1 php
(integer) 0
> ZRANK zsets1 c++
(integer) 3
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
> ZRANK zsets4 c
(integer) 5

一个或多个有序集的交集并将结果集存储在新的有序集(ZINTERSTORE)

# destination 新的集合 numkeys 合并集合数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]

返回值

> zadd zsets2 1 c++ 2 py 3 ruby
(integer) 2
> ZINTERSTORE zsets3 2 zsets1 zsets2
(integer) 1
> ZRANGE zsets3 0 -1
1) "c++"

一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)

# destination 新的集合 numkeys 合并集合数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]

返回值

> ZUNIONSTORE zsets4 2 zsets1 zsets2
(integer) 8
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"

返指定区间内的成员(ZREVRANGE)【通过索引,分数从高到低】

ZREVRANGE key start stop [WITHSCORES]

返回值

> ZREVRANGE zsets4 0 -1
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

注意:max在前,min在后,不然可能查不到数据

返回值

> ZREVRANGEBYSCORE zsets4 +inf -inf
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

删除(ZREM、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX)

删除一个或多个成员(ZREM)

ZREM key member [member ...]

返回值

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
7) "c++"
8) "a"
> ZREM zsets4 a c++
(integer) 2
> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"

删除排名区间的所有成员 (ZREMRANGEBYRANK)

ZREMRANGEBYRANK key start stop

返回值

> ZRANGE zsets4 0 -1
1) "php"
2) "java"
3) "py"
4) "python"
5) "ruby"
6) "c"
> ZREMRANGEBYRANK zsets4 0 3
(integer) 4
> ZRANGE zsets4 0 -1
1) "ruby"
2) "c"

删除分数区间的所有成员(ZREMRANGEBYSCORE)

ZREMRANGEBYSCORE key min max

返回值

> ZRANGE zsets4 0 -1 WITHSCORES
1) "ruby"
2) "3"
3) "c"
4) "5"
> ZREMRANGEBYSCORE zsets4 -inf +inf
(integer) 2
> ZRANGE zsets4 0 -1 WITHSCORES
(empty array)

移除有序集合中给定的字典区间的所有成员(ZREMRANGEBYLEX)

ZREMRANGEBYLEX key min max

返回值

> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREMRANGEBYLEX zsets1 (java [aaaa
(integer) 0

其他操作(ZSCAN)

迭代(ZSCAN)

ZSCAN key cursor [MATCH pattern] [COUNT count]

返回值

参考字符串迭代

本文参考&引用

Redis 有序集合(sorted set) | 菜鸟教程

Redis 中 SortedSet(集合)类型的命令

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
存储 NoSQL Java
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
面试官问:那有序集合为什么要同时使用字典和跳跃表来实现?我:这个设计主要是考虑了性能因素。1. 如果单纯使用字典,查询的效率很高是O(1),但执行类似ZRANGE、ZRNK时,排序性能低。每次排序需要在内存上对字典进行排序一次,同时消耗了额外的O(n)内存空间
【Redis系列】那有序集合为什么要同时使用字典和跳跃表
|
存储 NoSQL API
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
|
2月前
|
存储 NoSQL 关系型数据库
Redis 有序集合(sorted set)
10月更文挑战第17天
82 4
|
3月前
|
存储 NoSQL API
7)深度解密 Redis 的有序集合(ZSet)
7)深度解密 Redis 的有序集合(ZSet)
50 0
|
6月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——集合操作与有序集合操作
【Redis】 Java操作客户端命令——集合操作与有序集合操作
|
6月前
|
NoSQL Redis
【Redis】 关于 Redis 有序集合类型
【Redis】 关于 Redis 有序集合类型
|
7月前
|
机器学习/深度学习 NoSQL Redis
Redis -- zset有序集合
Redis -- zset有序集合
125 0
|
消息中间件 存储 缓存
有序集合都不会用还能说懂Redis吗
谈起redis相信很多人都会说,这个我懂,不就是缓存嘛。然而,要是问题redis有哪些数据类型,瞬间就懵了。难道不是key-value存储吗?这是很多初学者的理解。Redis作为当今主流的NOSQL数据库之一,其用处可谓神通广大,数据类型也是比同类作为缓存的memcache丰富多了,再说其队列数据类型和消息队列的实现,以及集群,哨兵机制,真是个知识万花筒。先不说什么Redis的基础概念和高级缓存应用了,有兴趣的可以去看官方文档啦。今天来总结下社交或者排行榜场景经常用到的有序集合数据类型,也为小马即将要搞的一个功能打一下前阵。
75 0
有序集合都不会用还能说懂Redis吗
|
7月前
|
存储 NoSQL 调度
Redis的有序集合(Sorted Set)详解
Redis的有序集合(Sorted Set)详解
259 0
|
存储 NoSQL Redis
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令
一步一步学习Redis——五大数据类型之有序集合(ZSet)的相关命令