一种以存储键值对的形式字典结构(key-value)。
哈希类型适合存储对象;使用对象类别和ID构成键名,使用字段表示独享的属性。而字段存储属性值。
hset key field value field2 value2 field3 value3 //这条语句等价于
hmset key field value field2 value2 field3 value3
例如一扫地机器人, 可以称它为ROBOT:1, 它的功能(function)为清洁(cleaning),它的名称(name)为joy。 价格(price)为200元。
那么就可以这样使用语句:
hset ROBOT:1 function cleaning name joy price 200
hgetall key 获取某个哈希的所有类型的字段以及字段对应的值。
hget key field
使用type查询键值类型时, 只能查询到key,使用hgetall才能查询到key和field的值。
HSET的命令不需要区分插入和更新操作。所以修改数据之前不需要判断字段是否存在。
底层实现: 哈希表。 一个哈希表里有有多个哈希表节点,每个哈希表节点就保存一个键值对。
//哈希表
typedef struct dictht {
//哈希表数据
dictEntry **table;
//哈希表大小
unsigned long size;
//哈希表大小掩码, 用于计算索引值。总等于-1。
unsinged long sizemask;
//哈希表已有节点数量。
unsigned long used;
}dictht;
//哈希表节点
typedef struct dictEntry {
//key
void *key;
//value
union {
void *val;
uint64_tu64;
int64_ts64;
} v;
struct dictEntry *next;
}
//字典
typedef struct dict {
// 类型特定函数
dictType *type;
// 私有数据
void *privdata;
//哈希表
dictht ht[2];
//rehash索引, 当rehash不存在时,值为-1
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;
typdef struct dictType {
unsigned int (*hashFunction) (const void *key);
void *(*keyDup) (void *privdata, const void *obj);
void *(*valDup) (void *privdata, const void *ojb);
void (*keyCompare) (void *privdata, const void *key1, const void *key2);
void (*keyDestructor) (void *privdata, void *key);
void (*valDestructor) (void *privdata, void *obj);
} dictType;
//TODO