码迷,mamicode.com
首页 > 其他好文 > 详细

redis_哈希对象

时间:2018-06-11 11:56:40      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:enc   图片   max   log   red   eval   task   image   链表   

redis哈希对象的底层编码有两种:ziplist、hashtable

ziplist编码

当一个哈希键只包含少量kv对、且key和value都是小整数值、短字符串时,redis会使用压缩列表来做

ziplist编码之前介绍过,最初是用在列表对象中的一种编码,在简单的哈希对象中也会用到。有遗忘时参考这里:https://www.cnblogs.com/loveCheery/p/9152144.html

在哈希对象中,采用ziplist编码时:

  • 先向压缩列表中放key、再放value
  • 先添加的对象放在表头,后添加的对象在尾部追加

比如:

127.0.0.1:6379> hset profile name "Tom"
(integer) 0
127.0.0.1:6379> hset profile age 25
(integer) 0
127.0.0.1:6379> hset profile career "Programmer"
(integer) 1
127.0.0.1:6379> object encoding profile
"ziplist"

其压缩列表的内部结果如:

技术分享图片

 

hashtable编码

hashtable编码采用字典作为底层实现。底层与1.8之前的jdk中map很相似,为链表数组,但是有自己的rehash条件、扩容收缩规则。

比如我们在上面的profile中插入一项较长字符串的vaule,其编码会转变为hashtable

127.0.0.1:6379> hset profile evaluation "So far as I know, Tom is a very kind boy, the boy u can trust. You can let him to do some tasks with high priority."
(integer) 1
127.0.0.1:6379> object encoding profile
"hashtable"

内部结构类似于:

技术分享图片

hashtable底层字典的插入、查询、对字典有遗忘看这里:https://www.cnblogs.com/loveCheery/p/9133674.html

 

编码转换

当对象同时满足这两个条件时,使用ziplist编码:

  1. 所有key和value的字符串长度都小于64字节(可使用hash-max-ziplist-value配置)
  2. key-value对数量小于512个(可使用hash-max-ziplist-entries配置)

不满足这两个条件时,转为hashtable编码。

 

还没验证是否会从hashtable转回ziplist

 

redis_哈希对象

标签:enc   图片   max   log   red   eval   task   image   链表   

原文地址:https://www.cnblogs.com/loveCheery/p/9166206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!