前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 有序集合(Zsets) 复习

Redis 有序集合(Zsets) 复习

作者头像
陈大剩博客
发布2023-03-06 09:07:19
6670
发布2023-03-06 09:07:19
举报
文章被收录于专栏:陈大剩博客专栏

介绍

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

应用场景

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

专有名词区分

需注意有序集合中 排名分数索引字典 等词区分。 字典 相当于集合中的元素,也是说 分数下面的 其中 排名 就是根据 分数从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名

命令大纲

新增(ZADD、ZINCRBY)

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

代码语言:javascript
复制
# 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 是默认自带

返回值
代码语言:javascript
复制
> ZADD zsets1 1 php 2 java 3 python 4 c++
(integer) 4

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

代码语言:javascript
复制
# increment 增量
ZINCRBY key increment member
返回值
代码语言:javascript
复制
> ZINCRBY zsets1 12 php
"14"

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

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

代码语言:javascript
复制
ZCARD key
返回值
代码语言:javascript
复制
> ZCARD zsets1
(integer) 6

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

代码语言:javascript
复制
# min 最大分数 max 最小分数
ZCOUNT key min max
返回值
代码语言:javascript
复制
> ZCOUNT zsets1 0 100
(integer) 6

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

代码语言:javascript
复制
ZLEXCOUNT key min max

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

返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]
返回值
代码语言:javascript
复制
> ZRANGE  zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c++"
6) "c"

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

代码语言:javascript
复制
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

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

返回值
代码语言:javascript
复制
# 显示分数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)【分数值递减(从大到小)排序】

代码语言:javascript
复制
ZREVRANK key member

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

返回值
代码语言:javascript
复制
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREVRANK zsets1 c++
(integer) 2

查找成员的分数值(ZSCORE)

代码语言:javascript
复制
ZSCORE key member
返回值
代码语言:javascript
复制
> ZSCORE zsets1 java
"2"

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

代码语言:javascript
复制
ZRANK key member
返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
# destination 新的集合 numkeys 合并集合数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
代码语言:javascript
复制
> zadd zsets2 1 c++ 2 py 3 ruby
(integer) 2
> ZINTERSTORE zsets3 2 zsets1 zsets2
(integer) 1
> ZRANGE zsets3 0 -1
1) "c++"

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

代码语言:javascript
复制
# destination 新的集合 numkeys 合并集合数
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
代码语言:javascript
复制
> 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)【通过索引,分数从高到低】

代码语言:javascript
复制
ZREVRANGE key start stop [WITHSCORES]
返回值
代码语言:javascript
复制
> ZREVRANGE zsets4 0 -1
1) "a"
2) "c++"
3) "c"
4) "ruby"
5) "python"
6) "py"
7) "java"
8) "php"

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

代码语言:javascript
复制
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

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

返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
ZREM key member [member ...]
返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
ZREMRANGEBYRANK key start stop
返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
ZREMRANGEBYSCORE key min max
返回值
代码语言:javascript
复制
> 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)

代码语言:javascript
复制
ZREMRANGEBYLEX key min max
返回值
代码语言:javascript
复制
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREMRANGEBYLEX zsets1 (java [aaaa
(integer) 0

其他操作(ZSCAN)

迭代(ZSCAN)

代码语言:javascript
复制
ZSCAN key cursor [MATCH pattern] [COUNT count]
返回值

参考字符串迭代

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 应用场景
  • 专有名词区分
  • 命令大纲
  • 新增(ZADD、ZINCRBY)
    • 添加一个或多个成员,或者更新成员的分数(ZADD)
      • 返回值
    • 对指定成员的分数加上增量 (ZINCRBY)
      • 返回值
  • 查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)
    • 获取有序集合的成员数(ZCARD)
      • 返回值
    • 计算在有序集合中指定区间分数的成员数(ZCOUNT)
      • 返回值
    • 获取值的区间内成员数量(ZLEXCOUNT)
      • 返回值
    • 通过索引区间返回有序集合指定区间内的成员(ZRANGE)
      • 返回值
    • 通过分数返回区间内的成员(ZRANGEBYSCORE)
      • 返回值
    • 指定成员的排名(ZREVRANK)【分数值递减(从大到小)排序】
      • 返回值
    • 查找成员的分数值(ZSCORE)
      • 返回值
    • 返回指定成员的排名(ZRANK)
      • 返回值
    • 一个或多个有序集的交集并将结果集存储在新的有序集(ZINTERSTORE)
      • 返回值
    • 一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)
      • 返回值
    • 返指定区间内的成员(ZREVRANGE)【通过索引,分数从高到低】
      • 返回值
    • 返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】
      • 返回值
  • 删除(ZREM、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX)
    • 删除一个或多个成员(ZREM)
      • 返回值
    • 删除排名区间的所有成员 (ZREMRANGEBYRANK)
      • 返回值
    • 删除分数区间的所有成员(ZREMRANGEBYSCORE)
      • 返回值
    • 移除有序集合中给定的字典区间的所有成员(ZREMRANGEBYLEX)
      • 返回值
  • 其他操作(ZSCAN)
    • 迭代(ZSCAN)
      • 返回值
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档