码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Redis 哈希Hash底层数据结构


    1. Redis 底层数据结构

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

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

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

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

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

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

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

    默认情况下:

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

    2. hashtable

    在Redis中hashtable就是字典dict

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

    3. redisDb 与 redisObject

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

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

    4. ziplist

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

    ziplist的大体布局如下:

    ...

    : 一个无符号整数,用于保存ziplist占用的字节数,包括zlbytes字段本身的四个字节。需要存储这个值,以便能够调整整个结构的大小,而不需要首先遍历它。
    : 列表中最后一个条目的偏移量。
     : 条目的数量。当有超过2^16-2个条目时,这个值被设置为2^16-1,我们需要遍历整个列表来知道它包含多少项。
    : 一个特殊的条目,表示 ziplist 的结尾

    5. linkedlist

    linkedlist是一个双向链表

    6. quicklist

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

    quicklist = linkedlist + ziplist

    7. 参考

    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



    欢迎各位转载,但必须在文章页面中给出作者和原文链接!
  • 相关阅读:
    Android codec2 视频框架 之应用
    43%非常看好TypeScript…解读“2022前端开发者现状报告”
    CSDN高质量:备战金九银十的Java八股文,看完这篇就够了
    代码分析Objective-C中的深拷贝与浅拷贝
    《视觉 SLAM 十四讲》V2 第 9 讲 后端优化1 【扩展卡尔曼滤波器 EKF && BA+非线性优化(Ceres、g2o)】
    04-HTTPS证书格式及转换
    十天学完基础数据结构-第二天(数据结构简介)
    【算法】快排
    企业邮箱“成员收发权限”功能详解【如何开通企业邮箱】
    并查集原理
  • 原文地址:https://www.cnblogs.com/cjsblog/p/16526256.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号