Redis源码剖析和注释(十一)--- 哈希键命令的实现(t_hash)

Redis 哈希键命令实现(t_hash)

1. 哈希命令介绍

Redis 所有哈希命令如下表所示:Redis 哈希命令详解

序号 命令及描述
1 HDEL key field2 [field2]:删除一个或多个哈希表字段
2 HEXISTS key field:查看哈希表 key 中,指定的字段是否存在。
3 HGET key field:获取存储在哈希表中指定字段的值。
4 HGETALL key:获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment:为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment:为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key:获取所有哈希表中的字段
8 HLEN key:获取哈希表中字段的数量
9 HMGET key field1 [field2]:获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ]:同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value:将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value:只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key:获取哈希表中所有值
14 HSCAN key cursor [MATCH pattern][COUNT count]: 迭代哈希表中的键值对。

2. 哈希类型的实现

之前在redis对象系统源码剖析和注释中提到,一个哈希类型的对象的编码有两种,分别是OBJ_ENCODING_ZIPLIST和OBJ_ENCODING_HT。

redis 压缩列表源码剖析和注释

redis 字典结构源码剖析和注释

编码—encoding 对象—ptr
OBJ_ENCODING_ZIPLIST 压缩列表实现的哈希对象
OBJ_ENCODING_HT 字典实现的哈希对象

但是默认创建的哈希类型的对象编码为OBJ_ENCODING_ZIPLIST,OBJ_ENCODING_HT类型编码是通过达到配置的阈值条件后,进行转换得到的。

阈值条件为:

/* redis.conf文件中的阈值 */
hash-max-ziplist-value 64 // ziplist中最大能存放的值长度
hash-max-ziplist-entries 512 // ziplist中最多能存放的entry节点数量

一个哈希对象的结构定义如下:

typedef struct redisObject {
    //对象的数据类型,字符串对象应该为 OBJ_HASH
    unsigned type:4;        
    //对象的编码类型,分别为 OBJ_ENCODING_ZIPLIST 或 OBJ_ENCODING_HT
    unsigned encoding:4;
    //暂且不关心该成员
    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
    //引用计数
    int refcount;
    //指向底层数据实现的指针,指向一个dict的字典结构
    void *ptr;
} robj;

例如,我们创建一个 user:info 哈希键,有三个字段,分别是name,sex,passwd。

127.0.0.1:6379> HMSET user:info name Mike sex male passwd 123456
OK
127.0.0.1:6379> HGETALL user:info
1) "name"
2) "Mike"
3) "sex"
4) "male"
5) "passwd"
6) "123456"

我们以此为例,查看redis的哈希对象的空间结构。

根据这些信息的大小,redis应该为其创建一个编码为OBJ_ENCODING_ZIPLIST的哈希对象。如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值