前言
在 redis 中,本身就是使用 key-value 哈希表结构来存储数据;
key 是stirng类型,而 value也可以是 hash 类型;
这里 value 哈希类型中的映射关系通常称为 field-value(和reis中的 key-value 区分);而 value 指的是 field 对应的值
常用命令
HSET
hset key field value [field value]
设置 hash表中指定的字段的值(设置hash中键值对 field-value);可以一次设置多组键值对(field-value)
返回值:添加键值对的个数

这里 hset命名可以一次设置多组键值对,和 hmset 命令功能一样
HSETNX
hsetnx key field value
当字段不存在时,再进行设置 hash 表中的字段和值
返回值:1 表示设置成功,0 表示设置失败
HGET
hget key field
获取 hash 表中指定字段对应的值
返回值:返回对应的value或者nil

HMGET
hmget key field [field]
获取 hash 表中指定字段 field 对应的值 value(可以一次获取多个value)

HEXISTS
hexists key field
判断 hash 表中指定字段 field 是否存在
返回值:1 表示存在,0 表示不存在
如果key都不存在,那field肯定也不存在,返回值就是 0

HDEL
hdel key field [field]
删除 hash 表中的指定字段
返回值:成功删除的字段的个数
注意:hdel 是删除 key 对应 value 的hash表中的字段,del命令 是删除 key

HKEYS
hkeys key
获取 hash 表中的所有字段
hkeys 获取 key 对应 value 的hash表中的所有 field,keys命令是获取所有的 key

HVALS
hvals key
获取 hash 表中所有的值(获取 hash 表中的 所有 value)

HGETALL
hgetall key
获取 hash 表中所有的键值对(field-value)

HLEN
hlen key
获取 hash 表中的键值对个数

内部编码
ziplist
ziplist(压缩列表)是Redis为了节省内存而设计的一种紧凑的连续存储结构,并非专门为哈希类型设计,但因其高效的内存利用率,被选为哈希类型在特定条件下的内部实现。
当哈希类型满足以下两个条件时,Redis会优先使用ziplist作为内部实现:
- 哈希中的元素个数小于
hash-max-ziplist-entries配置值(默认值为512个); - 哈希中所有元素的值的长度都小于
hash-max-ziplist-value配置值(默认值为64字节)。
hashtable
hashtable(哈希表)是Redis中另一种核心的内部实现,我们熟悉的字符串类型(当值较大时)、集合类型等也会用到它。对于哈希类型而言,当无法满足上述ziplist的两个条件时,Redis会自动将内部实现切换为hashtable。
ziplist虽然节省内存,但它的结构决定了其读写效率会随着元素数量和值长度的增加而下降:当元素增多、值变大时,ziplist的插入、删除、查找操作需要频繁地移动内存中的数据,时间复杂度会逐渐升高。
而hashtable的优势恰恰在于高效的读写性能------它通过哈希函数将元素映射到不同的桶中,无论是插入、删除还是查找操作,平均时间复杂度都能稳定在O(1)。当哈希中的元素数量较多(超过512个),或者存在值长度较大(超过64字节)的元素时,hashtable能够保证读写操作的高效性,避免因ziplist的性能瓶颈影响整体服务效率。