0%

redis之hash

哈希对象的编码可以是ziplist和hashtable之一。

一、原理

哈希对象的编码可以是ziplist和hashtable之一。

  1. ziplist编码:在ziplist编码的哈希对象中,key-value键值对是以紧密相连的方式放入压缩链表的,先把key放入表尾,再放入value;键值对总是向表尾添加。

ziplist编码

  1. hashtable编码:哈希对象中的每个key-value对都使用一个字典键值对来保存,字典的键和值都是字符串对象,字典的键保存key-value的key,字典的值保存key-value的value。

hashtable编码

  1. 编码转换
    • 哈希对象使用ziplist编码需要满足两个条件:
      • 一是所有键值对的键和值的字符串长度都小于64字节
      • 二是键值对数量小于512个;不满足任意一个都使用hashtable编码
    • 修改hash-max-ziplist-value选项和hash-max-ziplist-entries选项可配置以上两个条件。

二、命令

  1. hset(key, field, value):向名称为key的hash中添加元素field<—>value
  2. hget(key, field):返回名称为key的hash中field对应的value
  3. hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
  4. hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
  5. hincrby(key, field, integer):将名称为key的hash中field的value增加integer
  6. hexists(key, field):名称为key的hash中是否存在键为field的域
  7. hdel(key, field):删除名称为key的hash中键为field的域
  8. hlen(key):返回名称为key的hash中元素个数
  9. hkeys(key):返回名称为key的hash中所有键
  10. hvals(key):返回名称为key的hash中所有键对应的value
  11. hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

三、实验

  1. 初始化513个键值对

    • eval "for i=1,513 do redis.call('HSET',KEYS[1],i,i+1)end" 1 hash_513
    • object encoding hash_513,输出hashtable
  2. 初始化511个键值对

    • eval "for i=1,511 do redis.call('HSET',KEYS[1],i,i+1)end" 1 hash_511
    • object encoding hash_511,输出ziplist