版权声明:本文为博主原创文章,转正请注明出处。 https://blog.csdn.net/sinat_32366329/article/details/81105289
Redis哈希对象
- hash对象的存储结构类型
答:hash对象的存储结构有两种类型ziplist和hashtable。
- ziplist作为hash的底层实现时候,如何存储数据
答:由于ziplist是列表的存储结构,那么存储时候的key-value如何实现存储呢?当有新的键值对要加入到hash对象的时候,程序会先将键的压缩列表节点推入到压缩列表表尾,然后将保持了值的压缩列表节点推入到压缩列表表尾。因此,保持了同一键值对的两个节点总是紧挨在一起,保持了键的节点在前,保持值的节点在后。
例如:执行HSET profile name “Tom” HSET profile age 25 HSET profile career “Programmer”三个命令,如果hash底层使用ziplist作为实现,那么存储结构如下:
- hashtable作为hash的底层实现时候,如何存储数据
答:hashtable数据结构的底层实现其实是字典结构,hash对象中的每个键值对都使用一个字典键值对来保存:1)字典的每个键都是一个字符串对象,对象保存了键值对的键。2)字典的每个值都是一个字符串对象,对象保存了键值对的值。例如第二点中执行的命令,如果使用hashtable存储,结构如下:
- ziplist和hashtable之间如何决定使用哪种作为底层实现呢?
答:当哈希对象同时满足一下两个条件时,哈希对象使用ziplist编码:1)哈希对象保存的所有键值对的键和值的字符串长度都小于64字节。2)哈希对象保存的键值对数量小于512个。如果不能满足这两个条件的哈希对象需要使用hashtable编码。当然这两个参数是可以通过配置文件中的hash-max-ziplist-value和hash-max-ziplist-entries修改的。