zset

概述

  • Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
  • 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的 。
  • 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序来获取一个范围的元素。
  • 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
  • 此外,有序集合中的元素是按顺序获取的(因此它们不是按请求排序的,顺序是用于表示有序集合的数据结构的特性)。它们根据以下规则排序:
    • 如果 A 和 B 是具有不同分数的两个元素, 如果 A.score 是 > B.score,则 A > B。
    • 如果 A 和 B 的分数完全相同,则 A > B 如果 A 字符串按字典顺序大于 B 字符串。A 和 B 字符串不能相等,因为排序集只有唯一元素。

常用命令

  • 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zadd  key score1 value1 score2 value2...

如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。如果key存在,但是类型不是有序集合,将会返回一个错误应答。

  • 返回有序集 key 中,下标在之间的元素
zrange key start stop
#带withscores,可以让分数一起和值返回到结果集。
zrange key start stop withscores
#查询全部元素
zrange key 0 -1

参数start和stop都是从0开始的索引。
可以是负数,表示从有序集合的末尾的偏移量,其中-1是有序集合的最后一个元素,依次类推。
start和stop都是全包含的区间。
超出范围的索引不会产生错误。 如果start参数的值大于有序集合中的最大索引,或者start > stop,将会返回一个空列表。 如果stop的值大于有序集合的末尾,Redis会将其视为有序集合的最后一个元素。

  • 返回有序集 key 中,所有 score 值介于 min 和 max 之间的成员。
zrangebyscore key min max [withscores]
#加上withscores,返回结果就加上score
#如果不希望包含min或max,可以在前面加左括号
zrangebyscore key (min (max
#分页
zrangebyscore key min max limit offset count

包括分数等于max或者min的元素。
元素被认为是从低分到高分排序的。
具有相同分数的元素按字典序排列。
最小值可以用-inf代替表示最小值 ;最大值可以用+inf代替表示最大值

  • 返回有序集 key 中,所有 score 值介于 max和 min 之间
zrevrangebyscore key max min [withscores]
#分页
zrevrangebyscore key max min limit offset count

包括分数等于max或者min的元素。
元素被认为是从高分到低分排序的。
具有相同分数的元素按字典序倒序排列。
最小值可以用-inf代替表示最小值 ;最大值可以用+inf代替表示最大值

  • 为有序集合key指定元素的score加上增量
zincrby key increment member

如果key中不存在member,就在key中添加一个member,score是increment(就好像它之前的score是0.0)。如果key不存在,就创建一个只含有指定member成员的有序集合。
当key不是有序集类型时,返回一个错误。
score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值。

  • 删除该集合下,指定值的元素
zrem key member1,member2......

返回的是从有序集合中删除的成员个数,不包括不存在的成员。
当key存在,但是其不是有序集合类型,就返回一个错误。

  • 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。
zcount key min max
  • 返回key的有序集元素个数。
zcard key
  • 返回该值在集合中的排名,从0开始。
#从小到大
zrank key member
#从大到小
zrevrank key member
  • 删除并返回有序集合key中的最多count个具有最高得分的成员。
zpopmax key count

如未指定,count的默认值为1。指定一个大于有序集合的基数的count不会产生错误。 当返回多个元素时候,得分最高的元素将是第一个元素,然后是分数较低的元素。

  • 删除并返回有序集合key中的最高得分的成员。
bzpopmax key1,key2... timeout

当key有多个时,返回第一个非空集合的score最大的元素,key,score;
当集合列表都为空时,阻塞连接,timeout设为0表示永久阻塞,否则超过timeout就返回nil;

  • 删除并返回有序集合key中的最多count个具有最低得分的成员。
zpopmin key count

count默认值与zpopmax一样是1,只是当返回多个元素时候,得分最低的元素将是第一个元素,然后是分数较高的元素。

  • 删除并返回有序集合key中的最低得分的成员。
bzpopmin key1,key2... timeout

当key有多个时,返回第一个非空集合的score最小的元素,key,score;
当集合列表都为空时,阻塞连接,timeout设为0表示永久阻塞,否则超过timeout就返回nil;

  • 获取有序集合中指定成员之间的成员数量。
zlexcount zset [minMember [maxMember
#minMember 在有序集合中分数排名较小的成员
#maxMember在有序集合中分数排名较大的成员

成员名称前需要加 [ 符号作为开头, [ 符号与成员之间不能有空格
可以使用 - 和 + 表示得分最小值和最大值
min 和 max 不能反, max 放前面 min放后面会导致返回结果为0
计算成员之间的成员数量时,参数 min 和 max 的位置也计算在内。

演示

# 往有序集合zset中添加元素
127.0.0.1:6379> zadd zset 1 a 2 b 3 c 4 d 5 e
(integer) 5
# 获取有序集合zset中全部元素
127.0.0.1:6379> zrange zset 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
# 返回有序集合zset中所有score介于1~3的元素,从小到大
127.0.0.1:6379> zrangebyscore zset 1 3 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
# 返回有序集合zset中所有score介于1~3的元素,从大到小
127.0.0.1:6379> zrevrangebyscore zset 3 1 withscores
1) "c"
2) "3"
3) "b"
4) "2"
5) "a"
6) "1"
# 为有序集合zset的a元素的score加上增量10
127.0.0.1:6379> zincrby zset 10 a
#返回增加后的score
"11"
127.0.0.1:6379> zrange zset 0 -1
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"
127.0.0.1:6379> zrangebyscore zset -inf +inf withscores1) "b"2) "2"3) "c"4) "3"5) "d"6) "4"7) "e"8) "5"9) "a"
10) "11"
# 删除有序集合zset的a元素
127.0.0.1:6379> zrem zset a
#返回1表示删除成功
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
1) "b"
2) "c"
3) "d"
4) "e"
# 获取指定score范围([1,5])内元素个数
127.0.0.1:6379> zcount zset 1 5
(integer) 4
# 获取有序集合zset元素个数
127.0.0.1:6379> zcard zset
(integer) 4
# 获取有序集合zset中c元素的排名(从0开始,从小到大)
127.0.0.1:6379> zrank zset c
(integer) 1
# 获取有序集合zset中c元素的排名(从0开始,从大到小)
127.0.0.1:6379> zrevrank zset c
(integer) 2
# 获取并删除有序集合zset score最大的元素
127.0.0.1:6379> zpopmax zset
1) "e"
2) "5"
127.0.0.1:6379> zrange zset 0 -1
1) "b"
2) "c"
3) "d"
# 获取并删除有序集合zset score最小的元素
127.0.0.1:6379> zpopmin zset
1) "b"
2) "2"
127.0.0.1:6379> zrange zset 0 -1
1) "c"
2) "d"
# 获取zset全部元素,score从小到大
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "c"
2) "3"
3) "d"
4) "4"
127.0.0.1:6379> zadd zset 1 a 2 b 5 e
(integer) 3
127.0.0.1:6379> zrange zset 0 -1 withscores1) "a"2) "1"3) "b"4) "2"5) "c"6) "3"7) "d"8) "4"9) "e"
10) "5"
# 获取zset全部元素,score从大到小
127.0.0.1:6379> zrevrange zset 0 -1 withscores1) "e"2) "5"3) "d"4) "4"5) "c"6) "3"7) "b"8) "2"9) "a"
10) "1"
# 获取zset集合中元素a~c之间成员数量(包括a、c)
127.0.0.1:6379> zlexcount zset [a [c
(integer) 3
#按score从小到大顺序获取zset集合全部元素
127.0.0.1:6379> zrangebyscore zset -inf +inf withscores1) "a"2) "1"3) "b"4) "2"5) "c"6) "3"7) "d"8) "4"9) "e"
10) "5"
#按score从大到小顺序获取zset集合全部元素
127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores1) "e"2) "5"3) "d"4) "4"5) "c"6) "3"7) "b"8) "2"9) "a"
10) "1"
#按score从大到小顺序获取zset集合元素,并分页下标从0开始,元素数量为3
127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores limit 0 3
1) "e"  #下标0
2) "5"
3) "d"    #下标1
4) "4"
5) "c"    #下标2
6) "3"
#按score从大到小顺序获取zset集合元素,并分页下标从3开始,元素数量为3
127.0.0.1:6379> zrevrangebyscore zset +inf -inf withscores limit 3 3
1) "b"    #下标3
2) "2"
3) "a"    #下标4
4) "1"

数据结构

Sorted Set(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构
(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

案例

如何实现博客访问量排行榜?

127.0.0.1:6379> zadd blogs 1000 blog:1 2000 blog:2 3000 blog:3
(integer) 3
127.0.0.1:6379> zrevrangebyscore blogs +inf -inf withscores
1) "blog:3"
2) "3000"
3) "blog:2"
4) "2000"
5) "blog:1"
6) "1000"

redis有序集合zset详解相关推荐

  1. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

    许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...

  2. Redis(八):Zset有序集合数据类型详解

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...

  3. redis的数据结构||1) 字符串类型2) 哈希类型3) 列表类型4) 集合类型 5) 有序集合类型详解

    2. 下载安装     1. 官网:https://redis.io     2. 中文网:http://www.redis.net.cn/     3. 解压直接可以使用:         * re ...

  4. redis有序集合(Zset)

    2019独角兽企业重金招聘Python工程师标准>>> Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型 ...

  5. Redis 有序集合(zset)取交集(zinterstore)操作耗时测试

    取交集的场景很多,比如公众号文章显示有多少个好友已读,又或者群聊成员列表显示有多少个好友已经入群.最近遇到一个类似场景,一开始的觉得线上数据量较大,redis 取交集操作时间复杂度在O(N),实时计算 ...

  6. Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis-列表List.集合Set.哈希Hash.有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合(Set) 常用命令 数据结构 Redis 哈希(Hash) 常用命 ...

  7. Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist

    Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...

  8. PythonRedis 无序集合set、有序集合zset操作

    1.Redis控制台操作无序集合set 无序集合 元素为string类型 元素具有唯一性,不重复 redis操作: 设置 添加元素 SADD key member [member ...] 获取 返回 ...

  9. Redis有序集合命令ZREMRANGEBYLEX详解与应用

    Redis有序集合命令ZREMRANGEBYLEX详解与应用 本文是我在Redis中文网翻译团队翻译redis命令的相关内容,也是取得翻译团队同意后在CSDN同步发表 redis.cn翻译团队 也欢迎 ...

最新文章

  1. mysql主从 查询负载_MySQL集群:主从数据库配置 实现查询负载
  2. 滴滴面试算法-----有序二维数组查找
  3. Linux 下的NFS server 架设基础及方法
  4. 【Servlet】Cookie应用:显示上次访问页面时间
  5. 剑指-顺时针打印矩阵
  6. layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理
  7. 源码解析:修改mysql密码出现错误1045
  8. python简明教程中文pdf-简明Python教程-中文版.pdf
  9. 思科CCNP网络工程师 CCIE考试常见问题GRE虚拟专用网络详解
  10. 解决一例Fedora 31安装NVIDIA官方驱动程序无法使用DKMS注册的问题
  11. IcedTea6 1.7.3
  12. Mex-hdu4747(DP)
  13. FTP如何设置用户名密码
  14. 基于summernote的富文本编辑器,粘贴时去除word格式
  15. vue 使用emoji表情包
  16. 【阿里巴巴百川掌中测 限量内测招募啦】来自阿里的移动开发测试洪荒之力
  17. 删除数据库表中的重复记录
  18. 计算机word做课程表实验报告,《用word做课程表》教学设计
  19. 鸿蒙系统 美的,美的九阳搭载鸿蒙系统的家电上市了,这手机系统上市真的稳了...
  20. Jetson AGX Orin刷机教程

热门文章

  1. 华为提前发1500亿年终奖,任正非:钱给多了,不是人才也变成了人才!
  2. 计算机电源怎么设置玩游戏不卡,amd显卡怎么设置玩游戏更流畅
  3. 【自制】基于paddleOcr构建的批量识别纸质发票和电子发票程序(part1)
  4. 计算机第一启动设备改为U盘,怎么设置u盘为第一启动项bios u盘第一启动项bios设置方法【详解】...
  5. codeforces算法题和男人人生三禁忌
  6. VMWare 虚拟机中无法启用键盘的解决办法(PS/2标准键盘)
  7. 【交通运输与新基建(四)】交通运输新型基础建设重点方向
  8. java基于ssm的高校学生学籍信息管理系统
  9. Step1. 理解零知识证明算法之Zk-stark
  10. html网页设计中加横线,HTML:让网页超链接拥有多姿多彩的下划线(2)-网页设计,HTML/CSS...