当前位置: 代码网 > it编程>数据库>Redis > Redis SortedSet数据类型及其常用命令总结

Redis SortedSet数据类型及其常用命令总结

2024年07月03日 Redis 我要评论
一、redis概述redis概述sortedset类型redis的sortedset是一个可排序的set集合,与java中的treeset有些类似,但底层数据结构却差别很大。sortedset中的每一

一、redis概述

redis概述

在这里插入图片描述

sortedset类型

  • redis的sortedset是一个可排序的set集合,与java中的treeset有些类似,但底层数据结构却差别很大。
  • sortedset中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(skiplist)加 hash表。

sortedset具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为sortedset的可排序特性,经常被用来实现排行榜这样的功能。

1 zadd:向有序集合添加成员

添加一个或多个元素到sorted set ,如果已经存在则更新其score值

在这里插入图片描述

zadd 是 redis 中用于向有序集合添加成员的命令。

zadd key [nx|xx] [gt|lt] [ch] [incr] score member [score member ...]

  • key: 有序集合的键名。
  • nxxx(可选):用于指定操作的条件,nx 表示只在成员不存在时才添加,xx 表示只在成员已经存在时才添加。
  • gtlt(可选):用于指定操作的条件,gt 表示只添加比给定分数大的成员,lt 表示只添加比给定分数小的成员。
  • ch(可选):表示将返回值设置为新增成员的数量,即使是更新已经存在成员的分数。
  • incr(可选):表示将成员的分数与给定的增量相加,而不是将成员的分数设置为给定的值。
  • score member [score member ...]: 分数和成员组成的列表,可以一次性添加多个成员。

返回值

  • 返回值为整数,表示添加的成员数量,不包括已经存在并且分数被更新的成员。

行为说明

  • 将一个或多个成员添加到有序集合中,或者更新已经存在成员的分数。
  • 如果有序集合不存在,将会创建一个新的有序集合并添加成员。
  • 如果成员已经存在于有序集合中,它的分数将被更新。

示例

  • 向有序集合 zset1 中添加成员 member1member2,并指定分数:
zadd zset1 10 member1 20 member2

执行后:

  • 如果 zset1 不存在,将会被创建并添加成员。
  • 如果 member1 不存在,则添加 member1zset1 并设置分数为 10
  • 如果 member2 不存在,则添加 member2zset1 并设置分数为 20
  • 返回值为添加的成员数量,这里是 2

使用场景

  • 排行榜:用于存储和更新排行榜中的成员和分数。
  • 数据排序:在需要对数据进行排序和检索时使用。

2 zrem:从有序集合中移除一个或多个成员

在这里插入图片描述

zrem 是 redis 中用于从有序集合中移除一个或多个成员的命令。

zrem key member [member ...]
  • key: 有序集合的键名。
  • member: 要从有序集合中移除的成员。

返回值

  • 返回整数值,表示被成功移除的成员数量。

行为说明

  • 从有序集合中移除给定的成员,如果成员不存在于有序集合中,则忽略。
  • 如果有序集合在移除成员后变为空集,将自动删除该有序集合的键。

示例

有序集合 zset1,其中包含成员 member1member2member3

zadd zset1 10 member1 20 member2 30 member3

从有序集合 zset1 中移除成员 member2

zrem zset1 member2

执行后:

  • zset1 中将只剩下成员 member1member3
  • 返回值为 1,表示成功移除了一个成员。

尝试移除不存在的成员 member4

zrem zset1 member4

执行后:

  • zset1 保持不变,因为成员 member4 不存在。
  • 返回值为 0,表示没有移除任何成员。

注意事项

  • zrem 命令是原子的,这意味着在命令执行过程中不会有其他客户端能够对该有序集合进行操作。
  • 如果有序集合在移除成员后变为空集,将自动删除该有序集合的键。

3 zscore : 获取sorted set中的指定元素的score值

在这里插入图片描述

zscore 是 redis 中用于获取有序集合中指定成员的分数的命令。

zscore key member
  • key: 有序集合的键名。
  • member: 要查询分数的成员。

返回值

redis> zadd myzset 1 "one"
(integer) 1
redis> zscore myzset "one"
"1"

返回字符串形式的成员分数。如果成员不存在于有序集合中,则返回 nil

行为说明

  • 查询并返回有序集合中指定成员的分数。
  • 如果有序集合或成员不存在,将返回 nil

示例

有序集合 zset1,其中包含成员 member1member2member3,其分数分别为 102030

zadd zset1 10 member1 20 member2 30 member3

查询 member2 的分数:

zscore zset1 member2

执行后:

  • 返回值为 "20",表示 member2 的分数是 20

查询不存在的成员 member4 的分数:

zscore zset1 member4

执行后:

返回值为 nil,因为 member4 不存在于 zset1 中。

注意事项

zscore 命令是只读的,不会修改有序集合的内容。返回值是字符串形式的分数,即使实际分数是一个整数。

4 zrank:获取sorted set 中的指定元素的排名

在这里插入图片描述

zrank 是 redis 中用于获取有序集合中指定成员的排名(索引)的命令。

zrank key member [withscore]
  • key: 有序集合的键名。
  • member: 要查询排名的成员。
  • withscore: 可选参数,如果指定了 withscore,则返回成员的排名和分数。

返回值

redis> zadd myzset 1 "one"
(integer) 1
redis> zadd myzset 2 "two"
(integer) 1
redis> zadd myzset 3 "three"
(integer) 1
redis> zrank myzset "three"
(integer) 2
redis> zrank myzset "four"
(nil)
redis> zrank myzset "three" withscore
1) (integer) 2
2) "3"
redis> zrank myzset "four" withscore
(nil)

如果成员存在于有序集合中,返回成员的排名(从 0 开始)。如果成员不存在于有序集合中,返回 nil

如果指定了 withscore 参数,返回值将是一个包含排名和分数的数组:[排名, 分数]。

行为说明

  • 查询并返回有序集合中指定成员的排名。
  • 如果有序集合中存在多个相同分数的成员,排名按照成员的字典顺序进行排序。

示例

有序集合 zset1,其中包含成员 member1member2member3,其分数分别为 102030

zadd zset1 10 member1 20 member2 30 member3

查询 member2 的排名:

zrank zset1 member2

执行后:

返回值为 1,表示 member2 在有序集合中的排名是第二位(索引从 0 开始)。

查询 member4 的排名:

zrank zset1 member4

执行后:

  • 返回值为 nil,因为 member4 不存在于 zset1 中。

使用 withscore 参数查询 member2 的排名和分数:

zrank zset1 member2 withscore

执行后:

  • 返回值为 ["1", "20"],表示 member2 的排名是第二位,分数是 20

注意事项

  • zrank 命令只读,不会修改有序集合的内容。如果有序集合中存在多个相同分数的成员,排名将按照成员的字典顺序进行排序。

5 zcard:获取sorted set中的元素个数

在这里插入图片描述

redis> zadd myzset 1 "one"
(integer) 1
redis> zadd myzset 2 "two"
(integer) 1
redis> zcard myzset
(integer) 2

6 zcount:统计score值在给定范围内的所有元素的个数

在这里插入图片描述

zcount 是 redis 中用于获取有序集合中指定分数范围内的成员数量的命令。

zcount key min max
  • key: 有序集合的键名。
  • min: 分数范围的下限。
  • max: 分数范围的上限。

返回值

redis> zadd myzset 1 "one"
(integer) 1
redis> zadd myzset 2 "two"
(integer) 1
redis> zadd myzset 3 "three"
(integer) 1
redis> zcount myzset -inf +inf
(integer) 3
redis> zcount myzset (1 3
(integer) 2

返回指定分数范围内的成员数量。

行为说明

  • 查询并返回有序集合中分数在给定范围内的成员数量,包括边界的成员。

示例

有序集合 zset1,其中包含成员 member1member2member3,其分数分别为 102030

zadd zset1 10 member1 20 member2 30 member3

查询分数在 [15, 25] 范围内的成员数量:

zcount zset1 15 25

执行后:

假设有序集合中没有相同分数的成员,返回值将是 1,因为只有 member2 的分数在 1525 之间。

7 zincrby:让sorted set中的指定元素自增,步长为指定的increment值

在这里插入图片描述

zincrby 是 redis 中用于对有序集合中指定成员的分数进行增加或减少的命令。

zincrby key increment member
  • key: 有序集合的键名。
  • increment: 要增加(正数)或减少(负数)的分数。
  • member: 要增加或减少分数的成员。

返回值

redis> zadd myzset 1 "one"
(integer) 1
redis> zadd myzset 2 "two"
(integer) 1
redis> zincrby myzset 2 "one"
"3"
redis> zrange myzset 0 -1 withscores
1) "two"
2) "2"
3) "one"
4) "3"

返回成员的新分数。

行为说明

  • 如果给定的成员不存在于有序集合中,将会新增该成员并设置初始分数。
  • 如果给定的成员在有序集合中存在,将会更新该成员的分数。

示例

有序集合 zset1,其中包含成员 member1member2,它们的分数分别是 1020

zadd zset1 10 member1 20 member2

member1 的分数增加 5

zincrby zset1 5 member1

执行后:

返回值为 15,表示 member1 的新分数是 15

再将 member2 的分数减少 3.5

zincrby zset1 -3.5 member2

执行后:

  • 返回值为 16.5,表示 member2 的新分数是 16.5

注意事项

  • zincrby 命令可以增加或减少有序集合中成员的分数,如果成员不存在,会新增该成员并设置初始分数。

8 zrange:按照score排序后,获取指定排名范围内的元素

在这里插入图片描述

zrange 是 redis 中用于获取有序集合中指定范围内成员的命令。

支持多种选项来定制输出结果,包括按分数、字典顺序排序,反向排序,以及包含成员分数等。

zrange key start stop [byscore | bylex] [rev] [limit offset count] [withscores]
  • key: 有序集合的键名。
  • start: 开始位置(索引)。
  • stop: 结束位置(索引)。
  • byscore: 按分数排序。
  • bylex: 按字典顺序排序。
  • rev: 反向排序。
  • limit offset count: 返回结果的限制和偏移量。
  • withscores: 包含分数在输出结果中。

参数说明

  • startstop 可以是负数,表示从集合末尾开始计算。例如,-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。
  • byscorebylex 不能同时使用。
  • rev 可与 byscorebylex 一起使用,使得结果按指定顺序的反向输出。
  • limit offset count 用于分页,offset 表示偏移量,count 表示返回的最大元素数量。
  • withscores 将成员的分数一起返回。

示例

有序集合 zset1,其中包含以下成员和分数:

zadd zset1 1 "one" 2 "two" 3 "three" 4 "four"

获取索引从 0 到 2 的成员:

zrange zset1 0 2

返回:

1) "one"
2) "two"
3) "three"

获取索引从 0 到 2 的成员,并包含分数:

zrange zset1 0 2 withscores

返回:

1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

按分数范围获取成员,从分数 1 到 3:

zrange zset1 1 3 byscore

返回:

1) "one"
2) "two"
3) "three"

按字典顺序获取成员,并反向排列:

zrange zset1 - + bylex rev

返回:

1) "two"
2) "three"
3) "one"
4) "four"

使用 limit 选项来进行分页,获取按分数排序后的前两个成员:

zrange zset1 -inf +inf byscore limit 0 2

返回:

1) "one"
2) "two"

9 zdiff、zinter、zunion:求差集、交集、并集 zdiff

在这里插入图片描述

zdiff 用于计算多个有序集合之间的差集,并将结果存储在新的有序集合中。

zdiff numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
  • numkeys: 要进行差集计算的有序集合数量。
  • key: 要进行差集计算的有序集合键名。
  • weights weight [weight ...]: 可选参数,用于指定每个有序集合的权重,默认为 1。
  • aggregate sum|min|max: 可选参数,指定计算交集时如何聚合分数,默认为 sum

示例:

zdiff 3 zset1 zset2 zset3 weights 2 3 1 aggregate max

zinter

zinter 用于计算多个有序集合的交集,并将结果存储在新的有序集合中。

zinter numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

参数说明与 zdiff 类似,不同之处在于计算的是交集。

示例:

zinter 3 zset1 zset2 zset3 weights 2 3 1 aggregate max

zunion

在这里插入图片描述

zunion 用于计算多个有序集合的并集,并将结果存储在新的有序集合中。

zunion numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

参数说明与 zdiffzinter 类似,不同之处在于计算的是并集。

示例:

zunion 3 zset1 zset2 zset3 weights 2 3 1 aggregate max

更多的sortedset命令可以去官网https://redis.io/docs/latest/commands/?group=sorted-set查看哦~

在这里插入图片描述

到此这篇关于redis sortedset数据类型及其常用命令详解的文章就介绍到这了,更多相关redis sortedset数据类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com