多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 2.7.5 哈希对象(hash) 哈希对象的编码(encoding)可以是`ziplist`、`hashtable` 当哈希对象同时满足以下两个条件时,使用ziplist编码,否则使用hashtable编码: - 所有元素长度小于64字节(可以通过`hash-max-ziplist-value`设置) - 元素数量小于512个(可以通过`hash-max-ziplist-entries`设置) ---- ``` redis> HSET p name "zhang" (integer) 1 redis> HSET p age 25 (integer) 1 redis> p capacity 32 (integer) 1 ``` 如果p键使用的是ziplist编码,则其值对象如下所示: ``` redisObject type: REDIS_HASH encoding: REDIS_ENCODING_ZIPLIST ptr -> ziplist: { zlbytes, zltail, zllen, "name", "zhang", "age", 9, "capacity", 32, zlend } ... ``` 如果p键使用的是hashtable编码,则其值对象如下所示: ``` redisObject type: REDIS_HASH encoding: REDIS_ENCODING_HT ptr -> dict: { (stringObject:"age")->(stringObject:25), (stringObject:"capacity")->(stringObject:32), (stringObject:"name")->(stringObject:"zhang"), } ... ``` ---- 哈希命令的实现: 命令 | ziplist的实现 | hashtable的实现 ---- | ---- | ---- HSET | 调用ziplistPush函数,依次将键和值推入到压缩列表的表尾 | 调用dictAdd函数,将新节点添加到字典里面 HGET | 调用ziplistFind函数,在压缩列表里找指定键所对应的结点,然后调用ziplistNext函数,将指针移动到键结点的下一结点即值结点,返回之 | 调用dictFind函数,在字典中查找给定键,然后调用dictGetVal函数,返回该键所对应的值 HEXISTS | 调用ziplistFind函数,在压缩列表中查找指定键是否存在 | 调用dictFind函数,在字典中查找指定键是否存在 HDEL | 调用ziplistFind函数,如果查找到,则将其与下一结点即值结点都删除掉 | 调用dictDelete函数,在字典中删除指定键所对应的键值对 HLEN | 调用ziplistLen函数,将结果除以2后返回 | 调用dictSize函数,将结果返回 HGETALL | 遍历整个压缩列表,用ziplistGet函数返回所有键和值的结点 | 遍历整个字典,用dictGetKey函数返回字典的键,用dictGetValue函数返回字典的值