中间件 | 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
相关推荐
彭于晏Yan5 小时前
Redisson分布式锁
spring boot·redis·分布式
野犬寒鸦8 小时前
Redis复习记录day1
服务器·开发语言·数据库·redis·缓存
Nyarlathotep01138 小时前
Redis的内存回收和对象共享
redis·后端
QuZero9 小时前
JDK7 ConcurrentHashMap principle
java·哈希算法
野犬寒鸦10 小时前
Redis热点key问题解析与实战解决方案(附大厂实际方案讲解)
服务器·数据库·redis·后端·缓存·bootstrap
mldlds10 小时前
Windows安装Redis图文教程
数据库·windows·redis
Nyarlathotep011310 小时前
Redis的对象(5):有序集合对象
redis·后端
feng68_10 小时前
Redis架构实践
linux·运维·redis·架构·bootstrap
123过去11 小时前
responder使用教程
linux·网络·测试工具·安全·哈希算法
宵时待雨11 小时前
C++笔记归纳17:哈希
数据结构·c++·笔记·算法·哈希算法