redis 简单整理——redis 的有序集合基本结构和命令[六]
前言
简单介绍一下redis的有序集合的基本结构和命令。
正文
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序 集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性, 但不同的是,有序集合中的元素可以排序。
但是它和列表使用索引下标作为 排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依 据。
有序集合包含kris、mike、frank、tim、martin、tom, 它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定 分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助 我们在实际开发中解决很多问题。
注意:
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。

那么下面就来介绍其中的命令吧。
zadd key score member [score member ...]
注意点:
·Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
·nx:member必须不存在,才可以设置成功,用于添加。
·xx:member必须存在,才可以设置成功,用于更新。
·ch:返回此次操作后,有序集合元素和分数发生变化的个数
·incr:对score做增加,相当于后面介绍的zincrby
性能:
有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间 复杂度为O(log(n)),sadd的时间复杂度为O(1)。

zcard key 计算成员个数:

zscore 获取某个成员的权重:

如果不存在返回为空:

zrank 表示从低到高排序,从0开始的:

zrevrank 表示从高到底排序,从0开始的:

zrem key member 删除某个成员:

给某个值增加权重:

返回指定排名的成员:

如果加上withscores 还会返回分数:

zrevrange 自然就是从高到底排序,然后取出部分。
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
上面返回指定分数范围。
返回指定范围个数:
zcount key min max
删除指定排名内的升序元素:
zremrangebyrank key start end
删除指定分数范围的成员:
zremrangebyscore key min max
下面就是集合范围相关的东西了:
交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
这个命令参数较多,下面分别进行说明: ·destination:交集计算结果保存到这个键。
·numkeys:需要做交集计算键的个数。 ·key[key...]:需要做交集计算的键。139
·weights weight[weight...]:每个键的权重,在做交集计算时,每个键中 的每个member会将自己分数乘以这个权重,每个键的权重默认是1
。 ·aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、 min(最小值)、max(最大值)做汇总,默认值是sum。
并集:
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
复杂度:

内部编码
·ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。
·skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作 为内部实现,因为此时ziplist的读写效率会下降。
使用场景
有序集合比较典型的使用场景就是排行榜系统。
下面用点赞数排行作为例子:
1.例如用户mike上传了一个视频,并获得了3个赞,可以使用有序集合的 zadd和zincrby功能
zadd user:ranking:2016_03_15 mike 3
如果之后再获得一个赞,可以使用zincrby:
zincrby user:ranking:2016_03_15 mike 1
2.由于各种原因(例如用户注销、用户作弊)需要将用户删除,此时需要 将用户从榜单中删除掉,可以使用zrem。例如删除成员tom:
zrem user:ranking:2016_03_15 mike
3.展示获取赞数最多的十个用户 此功能使用zrevrange命令实现:
zrevrangebyrank user:ranking:2016_03_15 0 9
- 此功能将用户名作为键后缀,将用户信息保存在哈希类型中,至于用户 的分数和排名可以使用zscore和zrank两个功能:
hgetall user:info:mike
zscore user:ranking:2016_03_15 mike
zrank user:ranking:2016_03_15 mike
结
下一节,键管理。
redis 简单整理——redis 的有序集合基本结构和命令[六]的更多相关文章
- Redis数据类型使用场景及有序集合SortedSet底层实现详解
Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...
- Redis常用操作--------SortedSet(有序集合)
1.ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. ...
- Redis常用命令入门5:有序集合类型
有序集合类型 上节我们一起学习了集合类型,感受到了redis的强大.现在我们接着学Redis的最后一个类型——有序集合类型. 有序集合类型,大家从名字上应该就可以知道,实际上就是在集合类型上加了个有序 ...
- 15天玩转redis —— 第六篇 有序集合类型
今天我们说一下Redis中最后一个数据类型 “有序集合类型”,回首之前学过的几个数据结构,不知道你会不会由衷感叹,开源的世界真好,写这 些代码的好心人真的要一生平安哈,不管我们想没想的到的东西,在这个 ...
- Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...
- Redis操作集合,有序集合
Set操作,Set集合就是不允许重复的列表 sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 sdiff(keys ...
- redis 有序集合(zset)函数
redis 有序集合(zset)函数 zAdd 命令/方法/函数 Adds the specified member with a given score to the sorted set stor ...
- Redis学习---Redis操作之有序集合
有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序. zadd(name, *args, **kw ...
- Redis 有序集合(sorted set),发布订阅,事务,脚本,连接,服务器(三)
Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...
- redis 有序集合数据结构实现 skiplist
Redis使用跳跃表作为有序集合键的的底层实现,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员是比较长的字符串时Redis就会使用跳跃表 来作为有序集合键的底层实现 Redis只在两 ...
随机推荐
- 安装Typora+PicGo七牛云图床问题解决
遇到两个问题 第一个安装PicGo软件打不开只在后台运行,卸载.重启都试过没用,按照默认安装路径到c盘才能打开软件. 第二个问题"设定存储区域"输入z0不行,需要输入cn-east ...
- TR069-STUN
原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制 2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...
- 加载远程vue文件 vue3-sfc-loader
需求 项目在写一些需求的时候,现场可能会有些变动,但是不想从新打包,这种情况可以考虑单独不打包的vue文件 注意vue2 import { loadModule } from 'vue3-sfc-lo ...
- 学习笔记-涛讲F#(中级)
目录 适配器模式 责任链模式 命令模式 策略模式 工厂模式 单例模式 其它内容 这一系列的视频主要讲了F#设计模式的实现,没有太多其它内容,笔记内容主要是转载Snippets tagged desig ...
- 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之六轴加速度传感器适配
一 前记 MPU-60X0 是全球首例9 轴运动处理传感器.它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processo ...
- ypipe, zmq的核心部件,无锁读写的管道。
必须指出,无锁读写只限于单个读跟单个写之间,读与读,还有写与写之间必须确保同步.所以ypipe不必读写锁rwlock或者读写之间的锁,但需要读锁跟写锁两个锁,在读端之间或在写端之间仍然是临界资源.本质 ...
- tableau 工作表分页
原创优阅达数据科技有限公司 https://mp.weixin.qq.com/s?__biz=MzA5MTU3NDI2NQ==&mid=2649465570&idx=1&sn= ...
- Swift self, Self, ==, === 傻傻分不清楚?
本文首发于 Ficow Shen's Blog,原文地址: Swift self, Self, ==, === 傻傻分不清楚?. 内容概览 前言 self 和 Self == 和 === 总结 前言 ...
- FFmpeg开发笔记(三)FFmpeg的可执行程序介绍
外界对于FFmpeg主要有两种使用途径,一种是在命令行运行FFmpeg的可执行程序,该方式适合没什么特殊要求的普通场景:另一种是通过代码调用FFmpeg的动态链接库,由于开发者可以在C代码中编排个性 ...
- Rust使用Sauron实现Web界面交互
目录 简介 架构 Application 和组件 简单入门示例 先决条件 创建新项目 编译库文件 引用库文件 运行项目 界面交互示例 创建项目 编译库文件 引用库文件 引用库文件 运行项目 参考资料 ...