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。
编码—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的哈希对象。如下图所示: