本文主要是介绍中间件 | Redis - [全局 hash 渐进 rehash],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
INDEX
- §1 全局 hash 表
- §2 渐进式 rehash
§1 全局 hash 表
全局 hash 是 redis 管理所有 key 的方式
就好像 mysql 中,所有数据库表、字段的信息依然存在表中
redis 中所有 key 的信息都存在一个全局的 hash 中
§2 渐进式 rehash
传统 rehash 有什么问题
传统 rehash 是买断式的,触发 rehash 后,需要在连续的时间内完成
- hash 的扩容
- 所有现存 entry 的 rehash
这种方式并不适用于 redis
- redis 是一个分布式缓存,key 可能很多,全局的 rehash 会很占时间
- 并且 rehash 过程中服务不可用
什么是渐进式 rehash
- 结合原容器的大小,重新开辟一块空间用于存放 hash 数组
- 不一口气处理所有 key,而是以桶为单位 rehash
- hash 结构如下,实际包含两个 hash 表
#dict字典的数据结构 typedef struct dict{dictType *type; void *privdata; dictht ht[2]; //结构如下long rehashidx; int itreators; }typedef struct dictht{dictEntry[] table;unsingned long size;unsingned long sizemask;(size-1)unsingned long used; }
- ht[0] 是实际数据,ht[1] 用于 rehash
- rehashidx 初始值 -1,表示不在 rehash 中
- 当 key 被新增、查询、删除时,直接对 key 所在的桶进行迁移
- 同时对桶下链表的每一个元素进行 rehash(ht[0] -> ht[1])
- rehash++
- rehash 过程中:
- 新增:单增,只增加 ht[1]
- 删除:双删,先删 ht[0],后删 ht[1]
- 查询:双查,先查 ht[0],后查 ht[1]
- 当所有桶全部迁移完成后
- rehashidx == ht[1].used 时完成
- ht[0] = ht[1]
- ht[1] = new dictht
- rehashidx = -1
这篇关于中间件 | Redis - [全局 hash 渐进 rehash]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!