Redis 基础教程

Redis 命令

Redis 高级教程

Redis 笔记

Redis 哈希(Hashes)底层数据结构及所有相关命令


Redis 的哈希(Hash)是一个 String 类型的 field 和 value 的映射表,Hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232-1 键值对(40 多亿)。Redis 的哈希底层结构和传统的哈希结构一样,由数组链表组成。

Redis 哈希底层数据结构

Redis 的哈希由叫字典的数据结构来实现,但 Redis 所使用的 C 语言并没有内置的这种数据结构,因此 Redis 构建了自己的字典实现。

哈希表结构图

哈希表针对指定的 key 进行散列计算后,可以映射到数组的一个位置,然后在指定的索引位置获取或存放数据,如果指定位置上存在数据(冲突),则进行链表遍历或添加链表,结构示图如下:

Redis 除了使用传统的哈希结果实现外,还在数据量少(key 数少和 value 占用字节数小)的时候,还会转变成压缩列表(ziplist)的结构,ziplist 分布结构如下:

area        |<---- ziplist header ---->|<----------- entries ------------->|<-end->|

size          4 bytes  4 bytes  2 bytes    ?        ?        ?        ?     1 byte
            +---------+--------+-------+--------+--------+--------+--------+-------+
component   | zlbytes | zltail | zllen | entry1 | entry2 |  ...   | entryN | zlend |
            +---------+--------+-------+--------+--------+--------+--------+-------+
                                       ^                          ^        ^
address                                |                          |        |
                                ZIPLIST_ENTRY_HEAD                |   ZIPLIST_ENTRY_END
                                                                  |
                                                         ZIPLIST_ENTRY_TAIL

Redis 的 hash 在如下两个配置时,会存储为 ziplist:

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

这是 redis 默认的配置,hash-max-ziplist-entries 表示键值对个数的阈值,即小于该值时满足压缩列表的条件,此外,另一个需要满足条件是 ziplist 大小不能超过 hash-max-ziplist-value 指定的值,如上的话,即 64 KB。

Redis 哈希命令

可用版本 命令及描述
>=2.0.0

HDEL key field [field ...]

删除哈希表 key 中的一个或多个指定域(field),不存在的域将被忽略。

>=2.0.0

HEXISTS key field

查看哈希表 key 中,指定域 field 是否存在。

>=2.0.0

HGET key field

返回哈希表 key 中指定域 field 的值。

>=2.0.0

HGETALL key

返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名之后是域的值,所以返回值的长度是哈希表大小的两倍。

>=2.0.0

HINCRBY key field increment

为哈希表 key 中的域 field 的值加上增量 increment。增量也可以为负数,相当于对指定域进行减法操作。

>=2.6.0

HINCRBYFLOAT key field increment

为哈希表 key 中的域 field 的值加上浮点数增量 increment。增量也可以为负浮点数,相当于对指定域进行减法操作。

>=2.0.0

HKEYS key

返回哈希表 key 中的所有域。

>=2.0.0

HLEN key

返回哈希表 key 中域的数量。

>=2.0.0

HMGET key field [field ...]

返回哈希表 key 中,一个或多个指定域的值。

>=2.0.0

HMSET key field value [field value ...]

同时将多个 field-value(域-值)对设置到哈希表 key 中。

>=2.8.0

HSCAN key cursor [MATCH pattern] [COUNT count]

用于迭代哈希键中的键值对。

>=2.0.0

HSET key field value

将哈希表 key 中的域 field 的值设为 value。

>=2.0.0

HSETNX key field value

将哈希表 key 中的域 field 的值设置为 value,当且仅当域 field 不存在时。

>=3.2.0

HSTRLEN key field

返回哈希表 key 中,与指定域 field 相关联的值的字符串长度。

>=2.0.0

HVALS key

返回哈希表 key 中所有域的值。