Redis
Redis 整体结构概述
5种基本数据类型 string
5种基本数据类型 list
Redis数据结构 skiplist
Redis数据结构 ziplist
Redis持久化机制
Redis哨兵机制
Redis事务机制
Redis分布式锁
Python 案例
Redis主从复制
本文档使用 MrDoc 发布
-
+
首页
Redis 整体结构概述
## db redis中有多个db,每个db就是一个dict对象 ## dict 数据结构图如下:  redis中的数据都是存储在dict中,使用**开链法**解决哈希冲突问题。 dictht也是哈希表,dict中有两个dictht对象,我们称之为第一哈希表和第二哈希表。 我们可以这样理解,第一哈希表是用来存储数据的,第二哈希表在第一哈希表空间不足需要扩展的时候才会使用。 很多文章都说dict是哈希表,但我觉得它只是对哈希表dictht的一个封装,dict本身并不是哈希表。 #### dictht ``` typedef struct dictht { dictEntry **table; // 哈希表的数据,是一个数组,每个元素是一个指向dictEntry对象的指针 unsigned long size; // 哈希表大小,table数组的长度 unsigned long sizemask; // 哈希表大小掩码,用于计算索引值。总是等于 size - 1 unsigned long used; // 该哈希表已有节点的数量 } dictht; ``` 哈希表的存储使用的是数组,说明它会将key计算哈希值后对数组长度取余,以确定这个key存放在数组的哪个位置。 #### dictEntry 哈希表中的元素,个人觉得把它称为dictElement更为合适。 ``` typedef struct dictEntry { void *key; // 键 union { // 值 void *val; uint64_t u64; int64_t s64; } v; struct dictEntry *next; // 相同key的下个节点,形成链表,解决哈希冲突问题 } dictEntry; ``` #### 扩展哈希表 普通的做法是,新创建一个哈希表对象,空间为原有哈希表的两倍,然后将原有哈希表中的数据重新计算哈希值放入新的哈希表。如果原有哈希表的内容较多,这个过程会比较耗时,这段时间内将不能提供服务。 redis的做法,其实跟上面普通的做法也是一样的,只不过在查询的时候会考虑两个哈希表,也就是如果在一个哈希表中查询不到,会去另一个哈希表中查找。所以在数据移动的过程中可以提供服务。 将数据从一个哈希表移动到另一个哈希表的过程,称为**rehash(重置哈希表)**。 #### 重置哈希表 redis有两种重置哈希表的机制,一是在执行CRUD的时候会会对操作的数据执行重置哈希表;二是定时程序会定期执行重置哈希表的操作。 ## redisObject 任何value都会被封装为一个redisObject 对象。 redisObject能指定 value 的类型、编码方式等属性。 ``` // 刚刚好32 bits typedef struct redisObject { unsigned type:4; // 对象的类型,字符串/列表/集合/哈希表 unsigned notused:2; // Not used unsigned encoding:4; // 编码的方式 unsigned lru:22; // lru time (relative to server.lruclock) int refcount; // 引用计数 void *ptr; // 数据指针,指向真正的数据 } robj; ``` #### type 类型 | 类型属性 | 描述 | 表示的类型 | 编码方式 | | --- | --- | --- | --- | |REDIS_STRING |字符串 |string |int/raw/embstr | |REDIS_LIST |列表 |list | | |REDIS_HASH |哈希表 |hash |hashtable/ziplist | |REDIS_SET |集合 |set | | |REDIS_ZSET |有序集合 |zset | | #### 编码方式 1. 字符串对象的编码方式 2. 哈希对象的编码方式 > 参考:[哈希对象](http://redisbook.com/preview/object/hash.html "哈希对象") ## 参考 > [Redis 数据结构综述](https://wiki.jikexueyuan.com/project/redis/data-structure-of-review.html "Redis 数据结构综述") [Redis(1)——5种基本数据结构](https://www.wmyskxz.com/2020/02/28/redis-1-5-chong-ji-ben-shu-ju-jie-gou/ "Redis(1)——5种基本数据结构")
gaojian
2021年8月20日 08:02
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码