常规操作

127.0.0.1:6379> zadd score 95 zj          #添加 zadd keyname score value
(integer) 1
127.0.0.1:6379> zadd score 90 jj
(integer) 1
127.0.0.1:6379> zadd score 93 ly
(integer) 1
127.0.0.1:6379> zrange score 0 -1            #按score正序列出,参数区间为排名范围
1) "jj"
2) "ly"
3) "zj"
127.0.0.1:6379> zrevrange score 0 -1     #按score倒序列出,参数区间为排名范围
1) "zj"
2) "ly"
3) "jj"
127.0.0.1:6379> zcard score                  #zset元素个数
(integer) 3
127.0.0.1:6379> zscore score jj              #获取相应value的score
"90"
127.0.0.1:6379> zadd score 89.5  wxb
(integer) 1
127.0.0.1:6379> zscore score wxb
"89.5"
127.0.0.1:6379> zrank score ly               #获取相应value的排名
(integer) 2
127.0.0.1:6379> zrangebyscore score  91 95   #根据分值区间遍历zset
1) "ly"
2) "zj"
127.0.0.1:6379> zrangebyscore score -inf 91 withscores       #根据区间(-∞,91)遍历zet,同时返回分值。int 代表无穷大。
1) "wxb"
2) "89.5"
3) "jj"
4) "90"
127.0.0.1:6379> zrem score wxb               #删除相应value
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "jj"
2) "ly"
3) "zj"

内部实现

zset即是一个set(保证内部value的唯一性),又对每个value赋予了一个score(代表value的排序权重)。其内部数据为“跳跃链表”,更具体的来说,zset的数据结构其实为hash+"跳跃链表"来实现的。

typedef struct zset{//跳跃表zskiplist *zsl;//字典dict *dice;
} zset;

hash的键保存元素的值,hash的值则保存元素的分值;跳跃表节点的 object 属性保存元素的成员,跳跃表节点的 score 属性保存元素的分值。
这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。
另外,当zset元素比较小且少时,其内部实现方式为ziplist(压缩表),此时每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。

跳跃链表

跳跃链表主要用于排序,一般的链表能够快速的进行增删,但是定位能力比较弱,跳跃表就是为了将其定位能力提高,这种方式能够将定位的时间复杂度降到O(lg(n))。其原理如下:

元素,2,5,9,13,21,27,29,30,36,43.红色为其查找27的路径(即搜索路径),并且在实际存储中,2所在内存只有一个并非这里的三个,上图是为了方便理解。这样在定位中就会快速些。其具体的内存结构如下:

其中每个kv代表每个元素,即k为元素值,v为分值。每个元素的层高不一样。越高的层所包含的元素越少。
随机层数
对于每个新添加的节点,都需要调用一个随机算法给它分配一个合理的层数(此处的合理一般是通过每层被分配上的概率来控制的),如随机算法得到的层数为3,则在该节点有三层,即第一层有该节点,第二层有该节点,第三层也有该节点。
插入过程
首先搜索插入点,在此过程中将得到“搜索路径”,然后创建新节点,再为其分配一个随机层数,最后将“搜索路径”上的节点和这个新节点通过前向后向指针串起来。当随机层数大于最大层数时,更新最大层数。
删除过程
删除过程与插入过程类型,注意最后也应该更新最大层数。
更新过程
更新是指值不变修改分值的情况,此时只需删除原有值再插入新值即可(有时更新分值并不会更改元素的相对位置,此时这么操作其实时更复杂了)。

另外,当值的分值相等时,Redis排序时还会对value进行排序。这是为了避免当所有的分值都相等时,对value的查找退化为O(n)。

redis数据类型之zset(有序列表)相关推荐

  1. Redis五大数据类型(字符串对象(string)、列表对象(list)、哈希对象(hash)、无序集合(set)和Sorted Set数据类型(zset有序集合))

    Redis五大数据类型 一.String(字符串)数据类型 1.SET/GET/APPEND/STRLEN 2.INCR/DECR/INCRBY/DECRBY 3.GETSET 4. SETEX 5. ...

  2. Redis中的zset 有序集合

    存储类型 sorted set,有序的set,每个元素有个score. score 相同时,按照key 的ASCII 码排序. 数据结构对比: 数据结构 是否允许重复元素 是否有序 有序实现方式 列表 ...

  3. redis数据类型_认识Redis与Redis的数据类型

    本文作为Redis的入门教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础. 文章概要: 1. Redis的介绍 2. Redis与其他数据库的对比 3 ...

  4. Redis源码-ZSet:Redis ZSet存储原理、Redis ZSet命令、 Redis ZSet两种存储底层编码ziplist/dict+skiplist、Redis ZSet应用场景

    Redis源码-ZSet:Redis ZSet存储原理.Redis ZSet命令. Redis ZSet两种存储底层编码ziplist/dict+skiplist.Redis ZSet应用场景 Red ...

  5. Redis 常用数据类型之 zset(有序集合)

    Redis 常用数据类型之 zset(有序集合) 有序集合 zset(sorted-set)相关特性 redis 有序集合 zset 与 无序 set 类型的一样,都是 string 类型的集合元素, ...

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

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

  7. Redis数据类型使用场景及有序集合SortedSet底层实现详解

    Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...

  8. REDIS01_概述、安装、key、字符串String、列表List、集合Set、Hash哈希、Zset有序集合、持久化策略

    文章目录 ①. Redis - 概述 ②. Redis - 安装 ③. 常用五大数据类型 ④. 字符串类型 - String ⑤. 列表类型 - list ⑥. 集合类型 - Set ⑦. 哈希类型 ...

  9. 第124天学习打卡(Redis Set Hash Zset 三种特殊数据类型 事务 乐观锁)

    Set(集合) set中的值不能重复 set是无序的且不重复 127.0.0.1:6379> sadd myset "hello" # set集合中添加值 (integer) ...

最新文章

  1. 调侃吴恩达,Diss特斯拉,吐槽OpenAI…《AI寒冬将至》作者点评2019“AI小丑秀”...
  2. 桌面虚拟化“寻人行动”-转裁
  3. thymeleaf模板的使用——1,thymeleaf概述|| thymeleaf 的使用方法|| 如何修改Thymeleaf的默认存放地址||Thymeleaf的相关语法
  4. 北京/杭州 | 阿里巴巴达摩院自然语言智能生物医学团队招聘研究型实习生
  5. Java应用全链路启动速度提升至15s,阿里云SAE能力再升级
  6. 什么是ZooKeeper
  7. c# Chart 服务器端动态创建ChartArea
  8. 女婿的行为,老丈人哪些不能管,哪些必须管,哪些可管可不管?
  9. 单片机pwm控制基本原理详解
  10. vscode更改配置文件路径_Visual Studio Code安装和配置
  11. python表白爱心_python 心形动画表白(turtle)
  12. 交换机配置第七讲(不同vlan相互通信2)
  13. 数据采集的基本方法?
  14. java中的notify和notifyAll有什么区别?
  15. springboot+mybatis-plus在log控制台输出sql语句
  16. 无盘工作站(三)-配置 PXE 无盘站软件
  17. 年轻人,你知道多少,做了多少!
  18. 多媒体信息设计原则有哪些
  19. Array type xxx is not assignable
  20. 小学教师计算机一级考试试题及答案,小学《信息技术》考试试题及答案(笔试)...

热门文章

  1. 游戏本天梯_Intel宣称游戏本性能碾压AMD:一看显卡有猫腻
  2. windows 10 开始菜单和cortana无法工作的问题
  3. javaWeb期末作业——蛋糕订购系统
  4. hive中的绣花模型_- 面料花型设计 GeoHive_9x_Airforce - MyDigitex
  5. java中的时间和时间戳
  6. 物联卡可以当做手机卡使用吗?
  7. mysql长轮询_ajax的轮询和长轮询
  8. vueuniapp三目运算符
  9. 计算机网络基础 之四:网络层
  10. 降噪耳机哪款好?性价比高的降噪耳机