Redis 哈希Hash底层数据结构

  1. Redis 底层数据结构

Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表。这感觉有点像Java中的HashMap。

Redis 哈希Hash底层数据结构

不同的数据类型的实现方式是不一样的,可以通过object encoding命令查看底层真正的数据存储结构

Redis 哈希Hash底层数据结构

同一种类型在不同的条件下所采用的数据结构也不一样,例如:

Redis 哈希Hash底层数据结构

Redis是键值对形式的数据库,key可以是任意值(PS:最终都会转成string),value有多种数据类型

详见:https://redis.io/docs/manual/data-types/data-types-tutorial/

Redis 哈希Hash底层数据结构

至此,已经很清楚,hash底层的结构是 ziplist 和 hashtable

那么,什么时候会从ziplist转成hashtable呢?这个在redis.conf中有相关的配置,如下:

Redis 哈希Hash底层数据结构

默认情况下:

  1. 当ziplist中entry的数量超过512的时候,会转成hashtable
  2. 单个元素的值超过64字节的时候,会转成hashtable

  3. hashtable

在Redis中hashtable就是字典dict

通过源码,可以看到dict是这样定义的:

Redis 哈希Hash底层数据结构

Redis 哈希Hash底层数据结构
  1. redisDb 与 redisObject

通过源码得知,redisDb代表redis数据库,redisObject代表存到数据库中的数据

Redis 哈希Hash底层数据结构

Redis 哈希Hash底层数据结构

字典dict的结构前面已经看过了,于是整个数据库的结构大概就是下面这个样子:

Redis 哈希Hash底层数据结构
  1. ziplist

Redis 哈希Hash底层数据结构

ziplist是一种特殊编码的双链表,被设计成非常节省内存。它存储字符串和整型值,其中整数被编码为实际整数,而不是一系列字符。它允许在O(1)时间内在列表的任意一边进行push和pop操作。但是,由于每个操作都需要重新分配ziplist所使用的内存,因此实际的复杂性与ziplist所使用的内存量有关。

ziplist的大体布局如下:

<span><zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend></zlend></entry></entry></entry></zllen></zltail></zlbytes></span>

Redis 哈希Hash底层数据结构
  1. linkedlist

Redis 哈希Hash底层数据结构

Redis 哈希Hash底层数据结构

linkedlist是一个双向链表

Redis 哈希Hash底层数据结构
  1. quicklist

Redis 哈希Hash底层数据结构

Redis 哈希Hash底层数据结构

Redis 哈希Hash底层数据结构

quicklistNode是一个32字节的结构体,描述快表的ziplist。

quicklist = linkedlist + ziplist

Redis 哈希Hash底层数据结构
  1. 参考

http://redisbook.com/index.html

http://blog.itpub.net/70000430/viewspace-2787985/

https://www.cnblogs.com/reecelin/p/13358432.html

https://juejin.cn/post/6844904008591605767

Original: https://www.cnblogs.com/cjsblog/p/16526256.html
Author: 废物大师兄
Title: Redis 哈希Hash底层数据结构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584867/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十七):登录验证码实现(Captcha)

    登录验证码 登录验证是一般系统都会有的功能,验证的方式也多种多样,比如输入式验证码,拖动式验证条,拖动式验证拼图等等。 我们这里先实现常规的输入验证码的方式,右边显示验证码图片,点…

    Java 2023年5月30日
    091
  • 万字剖析OpenFeign整合Ribbon实现负载均衡的原理

    大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribb…

    Java 2023年6月16日
    095
  • pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付

    使用本模块,可轻松实现支付宝支付、微信支付对接,从而专注于业务,无需关心第三方逻辑。 模块完全独立,无支付宝、微信SDK依赖。 基于Spring Boot。 依赖Redis。 我能…

    Java 2023年5月29日
    087
  • [转]SpringMVC+ Mybatis 配置多数据源 + 手动切换数据源

    正确可行的解决方法:使用Spring提供的AbstractRoutingDataSource类来根据请求路由到不同的数据源。具体做法是先设置两个不同的dataSource代表不同的…

    Java 2023年5月29日
    076
  • “假学习”与“真学习”

    什么叫做”假学习”? **一、看书 **买一堆书,有空看看。看书,这是典型的假学习。看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已。专业书都写…

    Java 2023年6月9日
    096
  • spring中Bean的生命周期

    1、 实例化bean:反射的方式生成对象 2、 填充bean的属性:populateBean(),进行依赖注入,这里可以扩展出循环依赖问题(三级缓存) 3、 调用aware接口相关…

    Java 2023年6月8日
    084
  • beanFactory 设计模式 Bean 生命周期的胡言乱语,哈哈

    写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码)。…

    Java 2023年6月5日
    076
  • @TransactionalEventListener 之Spring的事务监听器

    业务场景: 有时候需要一个动作之后触发另外一个动作,类似消息的机制。但使用kafka等又太重。 这时候可以使用Spring的事件来处理。比如我这有一个需要触发一个异步任务的业务场景…

    Java 2023年5月29日
    072
  • RabbitMQ的初识和快速入门

    1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以…

    Java 2023年6月7日
    074
  • Synchronized底层实现逻辑原理解析

    什么是同步的 如果一个资源被多个线程共享,我们需要同步线程,以避免资源抢占造成的资源数据混乱。在Java中,synchronized是实现线程同步的关键字。 使用synchroni…

    Java 2023年5月29日
    072
  • TCP/IP和UDP

    TCP/IP即传输控制/网络协议,是面向连接的协议,发送数据前要先建立连接(发送方和接收方的成对的两个之间必须建 立连接),TCP提供可靠的服务,也就是说,通过TCP连接传输的数据…

    Java 2023年6月13日
    078
  • idea中自定义修改jdk源码,加注释

    前言 最近打算出jdk源码的博客,想在源码基础上加注释,在此把方法分享给大家。 处理方法 打开project structures,选择sdk。根据上方的路径,找到zip包,进行解…

    Java 2023年5月30日
    097
  • WORD模板使用

    Date: 2012-12-03 13:05:55 中国标准时间 Author: csophys Org version 7.8.11 with Emacs version 24V…

    Java 2023年6月7日
    0112
  • 并发bug之源(一)-可见性

    CPU三级缓存 要聊可见性,这事儿还得从计算机的组成开始说起,我们都知道,计算机由CPU、内存、磁盘、显卡、外设等几部分组成,对于我们程序员而言,写代码主要关注CPU和内存两部分。…

    Java 2023年6月9日
    076
  • nginx跨域配置2022

    https://segmentfault.com/a/1190000012550346 上述链接中没有写token,下面代码增加了token 主要是这个 下面是上述链接中的完整文章…

    Java 2023年5月30日
    057
  • 云原生系列2 部署你的第一个k8s应用

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不chea…

    Java 2023年6月8日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球