前言

今天来说下Redis中hash、set、zset的底层数据结构原理!

Redis-哈希对象(hash)

hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两种数据结构我们之前都有讲解,ziplist就是上文提到的结构,hashtable之前讲解的redis结构,hash对象只有同时满足以下条件,才会采用ziplist编码:

  • hash对象保存的键和值字符串长度都小于64字节
  • hash对象保存的键值对数量小于512 ziplist存储的结构如下

上图中可以看到,当数据量比较小的时候,我们会将所有的key及value都当成一个元素,顺序的存入到ziplist中,构成有序。

hashtable存储的结构

字符串的set key value 和 hash 的区别是什么

  1. 过期时间,hash没有过期时间
  2. set不断的加值有一个问题,dict中有一个属性是dictht ht[2],主要是> 扩容用的,如果不断的加key,则整体redis内存就需要扩容,扩容就需要基于原有内存增加一倍,内存消耗很大

Redis-集合对象(set)

set是一个无序的、自动去重的集合数据类型,Set底层用两种数据结构存储,一个是hashtable,一个是inset。

其中hashtable的key为set中元素的值,而value为null

inset为可以理解为数组,使用inset数据结构需要满足下述两个条件:

  • 元素个数不少于默认值512
set-max-inset-entries 512

  • 元素可以用整型表示

intset的底层结构

查询方式一般采用二分查找法,实际查询复杂度也就在log(n)

Redis-有序集合对象(zset)

zset为有序(有限score排序,score相同则元素字典序),自动去重的集合数据类型,其底层实现为 字典(dict) + 跳表(skiplist),当数据比较少的时候用ziplist编码结构存储。

同时满足以下两个条件采用ziplist存储:

  • 有序集合保存的元素数量小于默认值128个
  • 有序集合保存的所有元素的长度小于默认值64字节

ziplist存储方式

当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值

字典(dict) + 跳表(skiplist)的存储方式

zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:

有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节

跳表的数据结构

首先我们理解一下什么是跳表

同种可以看到我们通过分等级,从最高等级向低等级查询,效率提高,其时间复杂度为logn(类似于二分查找)

dict+skiplist的最终的存储结构如下

基于上图我们看一下skiplist几个关键对象的数据结构,方便大家理解

zset

可以看到一个是dict结构,主要key是其集合元素,而value就是对应分值,而zkiplist作为跳跃表,按照分值排序,方便定位成员

zskiplist

zskiplistNode

zskiplistNode中的robj指针指向具体元素,注意这个指针和dict中key指针指向同一个元素,其中backward后腿指针便于回溯

总结

本节内容主要讲解了Redis中hash、set、zset的底层原理,其中hash底层采用两种,分别是ziplist和hashtable,set底层也分别采用两种hashtable和inset,其中inset也可以理解为数组,zset底层分别是ziplist和dict+skiplist,我们可以看到在节省内存、提高查询效率方面都体现了优秀的设计,这些都可以作为我们日后设计及开发中的宝贵经验。

大家看完有什么不懂的可以在下方留言讨论.

谢谢你的观看。

觉得文章对你有帮助的话记得关注我点个赞支持一下!

链接:https://juejin.im/post/6863258283483807752

set列表对象去重_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理相关推荐

  1. set列表对象去重_java中List对象列表去重或取出以及排序

    面试碰到几次list的去重和排序.下面介绍一种做法: 1. list去重 1.1 实体类Student List容量10k以上,要求去重复.这里Student的重复标准是属性相同,因此需要重写equa ...

  2. redis的zset的底层实现_Redis中hash、set、zset有多牛?从底层告诉你数据结构原理...

    前言 今天来说下Redis中hash.set.zset的底层数据结构原理! Redis-哈希对象(hash) hash的底层存储有两种数据结构,一种是ziplist,另外一种是hashtable,这两 ...

  3. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  4. python列表对象相同_Python中的学习列表对象,List

    List(列表) 是 Python 中使用最频繁的数据类型. 列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套). 列表是写在方括号 [ ...

  5. redis将散裂中某个值自增_Redis中hash表中的field的value自增可以用hincrby

    Redis HINCRBY命令用于增加存储在字段中存储由增量键哈希的数量.如果键不存在,新的key被哈希创建.如果字段不存在,值被设置为0之前进行操作. 回复整数,字段的增值操作后的值. redis ...

  6. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  7. redis映射的概念_Redis存储总是心里没底?你大概漏了这些数据结构原理

    原标题:Redis存储总是心里没底?你大概漏了这些数据结构原理 上一篇文章<Redis存储总用String?你大概错过了更优的使用方法>我们了解了Redis的数据类型特点与适用场景,本期内 ...

  8. c 数据压缩算法_Redis存储总是心里没底?你大概漏了这些数据结构原理

    一.Redis内存数据结构与编码 想要弄清楚Redis内部如何支持5种数据类型,也就是要弄清Redis到底是使用什么样的数据结构来存储.查找我们设置在内存中的数据. 虽然我们使用5种数据类型来缓存数据 ...

  9. 通过对象属性去重_Redis常见对象类型的底层数据结构

    作者:伍陆七 来源:cnblogs.com/chentianming/p/13838347.html Redis 是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis 支持 ...

最新文章

  1. 深度学习面试必备的25个问题
  2. sping配置文件中引入properties文件方式
  3. new、delete、malloc、free 在堆栈上的使用区别 C++
  4. JVM 生态系统 2018 调查报道
  5. Flutter 34: 图解自定义 View 之 Canvas (一)
  6. Spring Boot Actuator:自定义端点,其顶部具有MVC层
  7. java正则表达式及api_Java API 之 正则表达式
  8. java中gc触发的条件,各种gc触发条件统计
  9. iOS App图标和启动画面尺寸
  10. 疑似荣耀X10 Max巨屏新机入网:5000mAh电池+22.5W快充
  11. golang 定义一个空切片_Golang切片 一个隐讳的坑
  12. apache commons Java包简介
  13. 牛客《机器学习》习题收集整理
  14. 大连理工大学计算机视觉实验室,首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品 | ICCV 2019...
  15. 毕业设计 - 基于JAVA的小区/园区停车管理系统(简便易上手)
  16. matlab求一维热传导方程数值解代码,一维热传导方程数值解法及matlab实现
  17. 明尼苏达计算机科学与工程,2019上海软科世界一流学科排名计算机科学与工程专业排名明尼苏达大学双城分校排名第101-150...
  18. 《黑白团团队》第八次团队作业:Alpha冲刺 第三天
  19. [部署系列之一]轻松搞定水晶报表9.2打包
  20. vs2019编译错误:LINK : fatal error LNK1104: 无法打开文件“atls.lib”

热门文章

  1. 使用perl连接oracle数据库
  2. (一)JAVA 点滴积累之JAVA开发环境安装
  3. defer 和 async 区别
  4. 项目练习(二)—微博数据结构化
  5. vue-router之嵌套路由
  6. vue 项目常见功能(搜索 时间戳转换 过滤器)
  7. (转)VmWare下安装CentOS6图文安装教程
  8. Unknown symbol platform_driver_unregister (err 0)
  9. 大数据之-Hadoop3.x_MapReduce_Job提交流程---大数据之hadoop3.x工作笔记0103
  10. SpringCloud工作笔记037---spring cloud-zuul的Filter详解