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 |
删除哈希表 key 中的一个或多个指定域(field),不存在的域将被忽略。 |
>=2.0.0 |
查看哈希表 key 中,指定域 field 是否存在。 |
>=2.0.0 |
返回哈希表 key 中指定域 field 的值。 |
>=2.0.0 |
返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名之后是域的值,所以返回值的长度是哈希表大小的两倍。 |
>=2.0.0 |
为哈希表 key 中的域 field 的值加上增量 increment。增量也可以为负数,相当于对指定域进行减法操作。 |
>=2.6.0 |
HINCRBYFLOAT key field increment 为哈希表 key 中的域 field 的值加上浮点数增量 increment。增量也可以为负浮点数,相当于对指定域进行减法操作。 |
>=2.0.0 |
返回哈希表 key 中的所有域。 |
>=2.0.0 |
返回哈希表 key 中域的数量。 |
>=2.0.0 |
返回哈希表 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 |
将哈希表 key 中的域 field 的值设为 value。 |
>=2.0.0 |
将哈希表 key 中的域 field 的值设置为 value,当且仅当域 field 不存在时。 |
>=3.2.0 |
返回哈希表 key 中,与指定域 field 相关联的值的字符串长度。 |
>=2.0.0 |
返回哈希表 key 中所有域的值。 |