底层实现是ziplist(压缩列表)或hashtable。存储用户信息,商品信息,存的多
一、ziplist(多个元素的连续存储)
1、条件:hash元素数量<512个;且所有键值对的键和值字符串长度<64字节,时用ziplist。O(1)
2、Value内部就是HashMap。2种不同实现:
1)成员少时,用一维数组紧凑存储,对应的value redisObject的encoding为zipmap;
2)数量增大:自动转成HashMap,encoding为ht。用链地址法来解决冲突。每个节点都有next指针,构成单链表
二、hashtable
有两个哈希表,平时用;仅rehash用。随着对哈希表操作,键会增多或减少,存储键值映射,存储数字可自增或自减。
三、扩容/缩容
1、扩容:渐进式 rehash
原理:保留两个 hashtable ,查时,同时查询两个,旧中的内容一点点迁移到新,完成时新取代旧,移除最后一个后,将会被删除
指令:数据搬迁操作放在 hash 后续指令中,客户端后续没有指令操作,hash.Redis就用定时任务主动搬迁
触发条件:1)一般:hashtable 元素个数 = 数组长度,新数组是原数组2倍大。2)强制扩容:个数=数组长度5 倍。2)不扩容:如正在 bgsave(持久化) 时,因为要减少内存页的过多分离(Copy On Write)
缩容:个数<数组长度10%,hashtable 元素逐渐变少时,不会受 bgsave 的影响,

四、存字符串,Hash 与 String 区别(优点)
String 可以做的事情,Hash 都可以做
1、hash把所有相关的值聚集到一个 key 中,节省内存空间,便于集中管理。
2、只用一个 key,减少 key 冲突
3、批量获取值时,只用一个命令,减少内存/IO/CPU 消耗
五、Hash 不适合的场景
1、Field 不能单独设置过期时间
2、没有 bit 操作
3、要考虑数据量分布(value 非常大,无法分布到多个节点)


https://zhuanlan.zhihu.com/p/87803810
https://www.jianshu.com/p/51617d73a39d
网友评论