中间件 | Redis - [全局 hash & 渐进 rehash]

INDEX

      • [§1 全局 hash 表](#§1 全局 hash 表)
      • [§2 渐进式 rehash](#§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 表
    c 复制代码
    #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
相关推荐
海绵宝宝的好伙伴2 小时前
【数据结构】哈希表的理论与实现
数据结构·哈希算法·散列表
怀揣小梦想2 小时前
跟着Carl学算法--哈希表
数据结构·c++·笔记·算法·哈希算法·散列表
Nebula_g2 小时前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
对纯音乐情有独钟的阿甘2 小时前
【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数
c++·哈希算法·散列表
普通网友2 小时前
哈希表:高效存储与查找的核心原理
数据结构·哈希算法·散列表·csdn
DemonAvenger2 小时前
深入浅出 Redis 布隆过滤器:从原理到实战,10 年经验总结
数据库·redis·性能优化
JanelSirry13 小时前
MySQL分区表(PARTITION):水平分表示例 (基于用户ID哈希分表)不依赖第三方中间件
mysql·中间件·哈希算法
爬山算法15 小时前
Redis(66)Redis如何实现分布式锁?
数据库·redis·分布式
以己之15 小时前
NC313 两个数组的交集
算法·哈希算法
恋红尘16 小时前
Redis面试八股
数据库·redis·面试