Redis-数据结构

Redis key-value结构组织

首先,Redis使用了一个全局哈希表来保存所有的键值对。这个全局哈希表,也就是一个存放哈希桶(entry)的数组。Redis可以用哈希算法算出某个key的哈希值,直接取到这个数组这个位置的元素,也就是O(1)的读写。每个entry包含了两到三个部分,一个是 *key也就是指向键key的指针,一个 *value指向值value的指针,一级有可能会有 *next,当发生hash冲突时,使用链表存储值的下一个entry的位置指针。

冲突解决

上面提到了如果发生哈希冲突,会用一个链表的结构保存entry,一旦冲突变多势必影响读写性能,所以Redis会进行Rehash。Redis进行rehash的方式,是一开始就准备好两个数组h1, h2, h2为h1大小的两倍,使用h1的过程中,一旦h1元素多了,就将h1的内容拷贝到h2,然后释放h1。

为了保证rehash对读写业务影响尽可能小,Redis采用了 渐进式rehash:开始rehash的时候,redis仍然正常处理客户端请求,但每处理一个请求就 顺便从h1的第一个元素开始,把h1上的entries都拷贝到h2(这个思想倒是挺多地方有见到)。而且对于读的请求会先读h1没有就去读h2,而对于更新,删除操作也会对两个表进行,新增只会新增到h2,保证h1的数量会只减少不增。

Redis 数据结构

Redis有很多数据类型,这些数据类型都有一些元数据需要记录。Redis会封装这些数据在一个RedisObject里面,我们看看这个RedisObject长啥样:

Redis-数据结构
RedisObject主要包括了8字节的元数据和8字节的指针。元数据里有保存的数据类型,编码方式(底层实现),LRU即最后一次访问的时间,refcount引用计数。

RedisObject对整型数和简单字符串也做了优化,如果是整型数,*ptr就直接存整型数;如果是字符串,那么根据字符串大小(是否超过44字节)分为embstr编码方式,即ptr后紧凑地再分配一块内存存字符串,和raw方式,指针指向字符串。

应用数据结构

我们知道key就是一个字符串,而value,Redis提供了多种数据结构可以选择,包括常见的: String, List, Hash, Set, Sorted Set,和特殊的一些例如 Bitmap, HyperLogLogGEO

底层实现的数据结构

Redis底层实现主要依靠了 SDS(Simple Dynamic String), 双向链表, 压缩列表, 哈希表, 跳表, 整数数组,其和应用数据结构的关系如下表:

类型 编码方式 string raw/embstr/int hash hashtable/ziplist list linkedlist/ziplist/quicklist set hashtable/intset zset ziplist/skiplist

压缩列表

压缩列表其实就是一个数组,只是比数组在表头多了三个字段 zlbytes列表长度, zltail列表尾部偏移量, zllenentry的个数,表尾多了一个字段 zlend表示结束,如下图:

Redis-数据结构

在压缩列表中,查找第一个和最后一个元素的时间复杂度是O(1),而其他的则是O(N)

跳表

之前讲过这个,这里就不多说了//todo

Original: https://www.cnblogs.com/rachel-aoao/p/redis_data_structure.html
Author: rachel_aoao
Title: Redis-数据结构

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

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

(0)

大家都在看

  • SQL函数-聚合函数

    聚合函数 聚合函数是对一组数据进行汇总输出的函数。 输入:一组数据集合输出:单个值 举例:返回一组数据的最大值、平均数、最小、方差等操作。 常见函数举例: 1,AVG函数:返回一组…

    数据库 2023年6月16日
    076
  • HTTP状态码1XX深入理解

    前段时间看了《御赐小仵作》,里面有很多细节很有心。看了一些评论都是:终于在剧里能够看到真正在搞事业、发了工资第一时间还钱的正常人了。我印象比较深的是王府才能吃上的葡萄。觉得非常合理…

    数据库 2023年6月6日
    084
  • 大连交通大学课程共享

    如本页面访问适配不佳,阅读体验不好可访问公众号页面(适配更好)。公众号页面:https://mp.weixin.qq.com/s/5g2-Izrygm6WhKiT3z1yow 设立…

    数据库 2023年6月11日
    074
  • [LeetCode]1221. 分割平衡字符串

    在一个「平衡字符串」中,’L’ 和 ‘R’ 字符的数量是相同的。 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。 返回…

    数据库 2023年6月9日
    080
  • ATM系统开发(Java版)

    ATM系统Java模拟开发总结 ATM系统开发 技术点分析 1.面向对象编程 每个用户的账户都是一个对象,所以需要设计账户类Accent用于创建账户对象封装账户信息。 2.使用集合…

    数据库 2023年6月16日
    064
  • Linux Centos 打开和关闭防火墙

    systemctl status firewalld.service # 查看防火墙状态 systemctl start firewalld.service # 开启防火墙 sys…

    数据库 2023年6月14日
    085
  • 部署tomcat

    tomcat tomcat 一、tomcat是什么 二、tomcat部署 1.实现访问java测试网页 2.能够成功登录到tomcat首页中的host manager、server…

    数据库 2023年6月14日
    043
  • RadonDB MySQL on K8s 2.1.2 发布!

    RadonDB MySQL on Kubernetes 于 2 月 17 日发布了新版本 2.1.2 。该版本在节点的重建、增删等方面进行了全面升级。致谢: 首先感谢 @andyl…

    数据库 2023年5月24日
    065
  • Question07-查询学过”张三”老师授课的同学的信息

    * SELECT DISTINCT Student.* FROM Student , SC , Course , Teacher WHERE Student.SID = SC.SI…

    数据库 2023年6月16日
    049
  • 由delete引起的锁扩大

    由delete引起的锁扩大 阿里云月报中的一句话,出处:http://mysql.taobao.org/monthly/2022/01/01/ 但是Ghost Record是可以跟…

    数据库 2023年5月24日
    090
  • Linux的一些的常用命令

    小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: 2:切换目录与查看目录的文件: 3:文件目录的创建与删除: 4:文件的复制 删除与移动: 5:如何…

    数据库 2023年6月6日
    057
  • Indian Math tech

    https://www.youtube.com/watch?v=2j0nHEy5y18 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:htt…

    数据库 2023年6月11日
    069
  • 启程——博客之路

    憋了这么久还是忍不住开始写自己的博客了。。。之前总是看别人的博客,伸手党一个,但是时间久了,总有一些自己想说的话,想想分享一些技术、经验,也能记录自己的学习历程,毕竟编程这条路还很…

    数据库 2023年6月9日
    067
  • Linux 的应用安装,升级和卸载和Linux下更换yum源的方法

    Linux 的应用安装,升级和卸载 yum [-y] install 软件包名 (1)yum…

    数据库 2023年6月16日
    068
  • MySQL 数据备份与恢复

    数据备份 使用 mysqldump 命令可以将数据库中的数据备份成一个文本文件,表的结构和数据以 SQL 的形式将存储生成的文本文件 mysqldump -u username -…

    数据库 2023年5月24日
    0107
  • Zabbix自带模板监控MySQL服务

    Zabbix的服务端与客户端的安装这里不再赘述了,前面也有相应的文章介绍过了,感兴趣的伙伴们可以看看历史文章就可以了,今天主要介绍下如何利用zabbix自带的模板来监控MySQL服…

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