首页 » Web前端 » phphash对象技巧_Redis 源码分析哈希对象z_hash

phphash对象技巧_Redis 源码分析哈希对象z_hash

访客 2024-12-10 0

扫一扫用手机浏览

文章目录 [+]

两种存储构造(代码位置 src/t_hash.c):

ziplist 编码:

phphash对象技巧_Redis 源码分析哈希对象z_hash

ziplist 编码的哈希工具利用压缩列表作为底层实现,每当有新的键值对要加入到哈希工具时,程序会先将保存了键的压缩列表节点推入压缩列表表尾,然后在将保存了值的压缩列表表尾,因此:

phphash对象技巧_Redis 源码分析哈希对象z_hash
(图片来自网络侵删)

1、保存了同一个键值对的两个节点总是紧挨在一起,保存键的节点在前面,保存值的节点在后面。

2、先添加到哈希工具的键值对会被放在压缩列表的表头方向,而后添加到哈希工具中的键值对会被放在压缩列表的表尾方向。

举个例子:

127.0.0.1:6379> hset profile name "Tom"(integer) 1127.0.0.1:6379> hset profile age 25(integer) 1127.0.0.1:6379> hset profile career "Programmer"(integer) 1127.0.0.1:6379> object encoding profile"ziplist"复制代码

数据构造如下:

压缩列表底层实现(profile key 构造):

hashtable 编码:

编码转换:

同时知足一下两个条件的时候选择 ziplist 编码:

哈希工具保存的所有键值对的键和值的字符串长度都小于64 字节;哈希工具保存的切实其实对数量小于 512 个;不知足这两个条件的哈希工具须要利用 hashtable 编码(可以通过 hash-max-ziplist 和 hash-maxziplist-value 修正)。

举个例子(profile key 构造)::

127.0.0.1:6379> hset profile desc "Programmer 11111112121v121kl lldklakdkalgam fsfdslkgkskgsklgklsklgklsklgsdkgkskgdsklmvm,,vm,vm,,maafaklglkaklsfakslkf"(integer) 1127.0.0.1:6379> object encoding profile"hashtable"把稳点由 ziplist 转换为 dict 的操作是不可逆的尽可能的利用 ziplist 来作为 hash 底层实现。
长度尽可能掌握在 1000 以内,否则由于存取操作繁芜度 O(n) , 长列表会导致 CPU 花费亚种,工具也不要太大两个参数 hash-max-ziplist 和 hash-maxziplist-value 可在配置文件中修正ziplist 底层存储工具时, 查找韶光负载度为 O(n)利用场景存储工具(定长或者不定长字符串)set user:1:name Mack set user:1:age 23 set user:1:city shanghai 复制代码序列化字符串(结合 pb 一起利用,最为广泛)set user:1 serialize(userinfo) 复制代码优点:大略直不雅观,每个属性都支持单独更新缺陷:占用过多的键,内存占用量大,同时用户信息内聚性差,盛昌环境比较少利用哈希类型hmset user:1 name tom age 23 city shanghai 复制代码优点:简化编程,合理利用序列化,可以提高内存的利用效率。
缺陷:要掌握在 ziplist 和 hashtable 两种内部编码的转换, hashtable 会花费更多的内存常见操作

作者:心城以北链接:https://juejin.cn/post/7067946313735733284

标签:

相关文章