美文网首页
(2)Redis hash原理

(2)Redis hash原理

作者: hedgehog1112 | 来源:发表于2020-11-10 09:45 被阅读0次

底层实现是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

相关文章

网友评论

      本文标题:(2)Redis hash原理

      本文链接:https://www.haomeiwen.com/subject/oyifbktx.html