Redis Zset的底层原理

Redis Zset的底层原理

ZSet也就是SortedSet,其中每一个元素都需要指定一个score值和member值:

  • 可以根据score值排序后
  • member必须唯一
  • 可以根据member查询分数

因此,zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的哪种编码结构可以满足?

  • SkipList:可以排序,并且可以同时存储score和ele值(member)
  • HT(Dict):可以键值存储,并且可以根据key找value


当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipList结构来节省内存,不过需要同时满足两个条件:

  • 元素数量小于zset_max_ziplist_entries,默认值128(可以通过配置文件、命令修改默认值,如果元素数量==0,代表禁用ZipList)
  • 每个元素都小于zset_max_ziplist_value字节,默认值64

ziplist本身没有排序功能,而且没有键值对的概念,因此需要有zset通过编码实现:

  • ZipList是连续内存,因此score和element是紧挨在一起的两个entry, element在前,score在后
  • score越小越接近队首,score越大越接近队尾,按照score值升序排列
    ZipList图

Zset底层原理白话

元素数量大于最大entries,或每个元素都大于value字节,就采用哈希表+跳表的结果,否则采用ZipList;

当采用的是ZipList,慢慢添加元素,会往跳表转化,在zsetadd方法中做判断,具体逻辑是这样的,判断编码是不是ZipList,是的话判断当前元素是否存在,如果存在更新score分数;如果元素不存在,需要判断ZipList的长度、元素大小有没有超,如果超了,转为跳表

相关推荐
todoitbo4 分钟前
SQL Server数据库迁移:V9R4C019 如何接住存量 T-SQL 批处理
数据库·sql·国产数据库
云飞云共享云桌面12 分钟前
不用批量采购工作站|液压设备制造,SolidWorks 多人共享服务器方案
运维·服务器·网络·数据库·制造
写后端的胖头鱼20 分钟前
【高频面试题】SQL 查询慢怎么排查
数据库·sql·mysql·oracle·慢查询·高频面试题
蓝速科技28 分钟前
口岸政务窗口双屏翻译机落地应用指南
运维·数据结构·数据库·人工智能·科技·政务
风哥2号31 分钟前
数据库教程FGMT20‑Oracle容灾体系架构与数据库升级迁移方案
数据库·oracle·架构
wudongfang6661 小时前
mysql全量同步数据改增量
数据库·mysql
志栋智能1 小时前
超自动化安全的变更与配置安全管理
数据库·安全·自动化
toooooop81 小时前
thinkphp查询数据表最后的自增id
前端·javascript·数据库
风哥2号1 小时前
数据库教程FGMT19‑Oracle多租户容器架构与新特性总结
数据库·oracle·架构
garmin Chen1 小时前
MySQL精简面试题
数据库·后端·mysql·面试