中间件 | 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;
    }
    • ht0 是实际数据,ht1 用于 rehash
    • rehashidx 初始值 -1,表示不在 rehash 中
    • 当 key 被新增、查询、删除时,直接对 key 所在的桶进行迁移
      • 同时对桶下链表的每一个元素进行 rehash(ht0 -> ht1
      • rehash++
      • rehash 过程中:
        • 新增:单增,只增加 ht1
        • 删除:双删,先删 ht0,后删 ht1
        • 查询:双查,先查 ht0,后查 ht1
    • 当所有桶全部迁移完成后
      • rehashidx == ht1.used 时完成
      • ht0 = ht1
      • ht1 = new dictht
      • rehashidx = -1
相关推荐
逍遥德10 小时前
MQTT教程详解-04.SpringBoot集成MQTT(告别手动控制)
java·spring boot·物联网·中间件·iot·iotdb
我是一颗柠檬14 小时前
【Java后端技术亮点】热Key探测与本地缓存二级防护:Redis热点问题的终极解决方案
java·redis·后端·缓存·中间件
cfm_291415 小时前
Redis高并发缓存架构设计与性能优化实战
redis·缓存·性能优化
画江湖Test15 小时前
Redis 块的原理
数据库·redis·缓存·性能优化
海市公约15 小时前
Redis主从复制全量同步七步时序与命令传播机制详解
数据库·redis·缓存·主从复制·高可用架构·全量同步
小马爱打代码16 小时前
Redis 和 MySQL 双写一致性:延迟双删、读写锁、MQ、Canal 怎么选?
数据库·redis·mysql
我,也来自江湖17 小时前
Redis的持久化有哪些方式
数据库·redis·缓存
小小工匠17 小时前
Redis - 实现分页 + 多条件模糊查询:一套完整可落地的组合方案
数据库·redis·缓存·分页·模糊查询
阿演18 小时前
DataDjinn v0.1.6 更新:增加在线更新功能,Redis 数据源支持,表格预览和连接体验继续增强
数据库·redis·缓存·数据库连接工具
AI人工智能+电脑小能手18 小时前
【大白话说Java面试题 第89题】【Mysql篇】第19题:Hash 索引和 B+ 树索引的区别?它们在使用方面的区别?
java·数据库·mysql·面试·哈希算法