ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis - 数据结构

2022-05-27 15:35:57  阅读:182  来源: 互联网

标签:哈希 h2 h1 Redis key 数据结构


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长啥样:
RedisObject结构
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表示结束,如下图:
压缩列表

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

跳表

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

标签:哈希,h2,h1,Redis,key,数据结构
来源: https://www.cnblogs.com/rachel-aoao/p/redis_data_structure.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有