ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis 原理 - Hash [打印本页]

作者: 愛在花開的季節    时间: 2022-8-20 08:32
标题: Redis 原理 - Hash
Hash 数据结构

Hash使用 ziplist 图解


可以看到, 当hash以ziplist编码存储时,键值对依次按顺序存放在ziplist中,key在前,value在后.
Hash使用 hashtable 图解

哈希表相关的数据结构
  1. //字典
  2. typedef struct dict {
  3.     dictType *type; // 类型特定函数
  4.     void *privdata; // 私有数据
  5.     dictht ht[2]; // 每个字典使用两个哈希表,实现渐进式 rehash
  6.     int rehashidx;   // rehash 索引,当 rehash 不在进行时,值为 -1
  7.     int iterators; // 目前正在运行的安全迭代器的数量
  8. } dict;
  9. //哈希表
  10. typedef struct dictht {
  11.     dictEntry **table; // 哈希表数组
  12.     unsigned long size; // 哈希表大小
  13.     unsigned long sizemask; // 哈希表大小掩码,用于计算索引值, 总是等于 size - 1
  14.     unsigned long used; // 该哈希表已有节点的数量
  15. } dictht;
  16. //哈希表节点
  17. typedef struct dictEntry {
  18.     void *key; // 键
  19.     union {
  20.         void *val; // 值, 正常是指向一个 redisObject
  21.         uint64_t u64;
  22.         int64_t s64;
  23.     } v;
  24.     struct dictEntry *next; // 指向下个哈希表节点,形成链表 (拉链法解决hash冲突)
  25. } dictEntry;
复制代码
哈希表图解


渐进式rehash流程

当hashtable需要扩容时,redis使用渐进式rehash
Redis为什么需要渐进式rehash?

当存在超大的hashTable进行扩容时,如果不去渐进式扩容,单次扩容时间太长,扩容期间Redis服务不可用,将导致线程阻塞
Hash的常用命令


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4