redis的hash数据结构底层简记

  • hash:k和v都是string的hash表。
    • HSET(设置集合数据,4.0之前只能设置1个,之后可以设置多个),HSETNX(若k不存在则设置对应v),HDEL(删除指定kv,可以一次删除多个),DEL(删除Hash对象),HMSET(设置多个kv,4.0之后废弃),HGETALL(查找全部数据),HGET(查询k对应的v),HLEN(查找Hash中的元素总数),HSCAN(从指定位置查询一定量数据,ziplist较小会全部返回)。
    • hash数据量较小使用ziplist存储,数据量大时使用hashtable存储(区别set使用的hashtable的value是null)。
  • hashtable:底层dict里面有ht[2]字段,ht里是两个结构体dictht,kv数据存储在dictht的table字段指向的dictEntry链表(拉链法头插法)中。
    • 哈希掩码与哈希值相与确定该值在hashtable位置
    • 负载因子=used/size,负载因子大于等于1在不执行bgsave和bgrewriteaof时会扩容,负载因子大于5必须扩容。负载因子小于0.1缩容。
    • 扩容为新表ht[1]分配大于used二倍的最小2的次方幂,缩容分配新表大于used最小的2的次方幂。
    • 渐进rehash扩缩容,对ht[0]元素操作才将ht[0][rehashidx++]处元素转移到ht[1],迁移完成后交换两链表指针后在ht[1]新建空表并rehashidx设为-1
相关推荐
疯狂打码的少年3 分钟前
单向循环链表 + 尾指针:让插入删除更高效的秘密武器
数据结构·python·链表
indexsunny31 分钟前
互联网大厂Java面试实录:微服务+Spring Boot在电商场景中的应用
java·spring boot·redis·微服务·eureka·kafka·spring security
卢傢蕊1 小时前
NoSQL 之Redis 集群
数据库·redis·nosql
️是781 小时前
信息奥赛一本通—编程启蒙(3373:练64.2 图像旋转翻转变换)
数据结构·c++·算法
Bat U1 小时前
Java高阶数据结构|AVL树
数据结构
Xiu Yan1 小时前
Java 转 C++ 系列:STL容器之list
java·开发语言·数据结构·c++·stl·list·visual studio
Mr_pyx2 小时前
【LeetCodeHOT100】 160. 相交链表 —— Java多解法详解
java·数据结构·链表
霸道流氓气质2 小时前
Bat中实现简单运维脚本示例-启动redis、检测指定端口是否占用、占用则杀死进程、等待指定秒数、启动jar包
运维·redis·jar
杨凯凡2 小时前
【016】集合框架总览:List/Set/Map 与线程安全
java·数据结构·list