哈希表对象的彪马可以是ziplist
或者hashtable
ziplist
编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后在将保存了值的压缩列表节点推入到压缩列表的表尾。
- 保存了统一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值得节点在后;
- 先添加到哈希对象中的键值对会被放在压缩列表的表头方向,后来添加到哈希表对象中的键值对会被放在压缩列表的表尾方向。
hashtable
编码的哈希对象使用字典作为底层实现,哈希表对象中的每个键值对都使用一个字典键值对来保存:
- 字典的每个键都是一个字符串对象,对象中保存了键值对的键;
- 字典的每个值都是一个字符串对象,对象中保存了键值对的值。
8.4.1 编码转换
当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist
编码:
- 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
- 哈希对象保存的键值对数量小于512个;不能满足这两个条件的哈希对象需要使用
hashtable
编码。
8.4.2 哈希命令
1. HDEL
HDEL key field [field ...]
删除哈希表key
中的一个或多个指定域,不存在的域将被忽略。
2. HEXISTS
HEXISTS key field
查看哈希表key
中,给定域field
是否存在。
3. HGET
HGET key field
返回哈希表key
中给定域field
的值。
4. HGETALL
HGETALL key
返回哈希表key
中,所有的域和值。
在返回值里,紧跟每个域名(field name
)之后是域的值(value
),所以返回值的长度是哈希表大小的两倍。
5. HINCRBY
HINCRBY key field increment
为哈希表key
中的域field
的值加上增量increment
。
增量也可以为负数,相当于对给定域进行减法操作。
如果key
不存在,一个新的哈希表被创建并执行HINCRBY
命令。
如果域field
不存在,那么在执行命令前,域的值被初始化为0
。
对一个储存字符串值的域field
执行HINCRBY
命令将造成一个错误。
本操作的值被限制在64
位(bit
)有符号数字表示之内。
6. HINCRBYFLOAT
HINCRBYFLOAT key field increment
为哈希表key
中的域field
加上浮点数增量increment
。
如果哈希表中没有域field
,那么HINCRBYFLOAT
会先将域field
的值设为0
,然后再执行加法操作。
如果键key
不存在,那么HINCRBYFLOAT
会先创建一个哈希表,再创建域field
,最后再执行加法操作。
当以下任意一个条件发生时,返回一个错误:
- 域
field
的值不是字符串类型(因为redis
中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型) - 域
field 当前的值或给定的增量
increment不能解释(
parse)为双精度浮点数(
double precision floating point number`)
7. HKEYS
HKEYS key
返回哈希表key
中的所有域。
8. HLEN
HLEN key
返回哈希表key
中域的数量。
9. HMGET
HMGET key field [field ...]
返回哈希表key
中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个nil
值。
因为不存在的key
被当作一个空哈希表来处理,所以对一个不存在的key
进行HMGET
操作将返回一个只带有nil
值的表。
10. HMSET
HMSET key field value [field value ...]
同时将多个field-value
(域-值)对设置到哈希表key
中。
此命令会覆盖哈希表中已存在的域。
如果key
不存在,一个空哈希表被创建并执行HMSET
操作。
11. HSET
HSET key field value
将哈希表key
中的域field
的值设为value
。
如果key
不存在,一个新的哈希表被创建并进行HSET
操作。
如果域field
已经存在于哈希表中,旧值将被覆盖。
12. HSETNX
HSETNX key field value
将哈希表key
中的域field
的值设置为value
,当且仅当域field
不存在。
若域field
已经存在,该操作无效。
如果key
不存在,一个新哈希表被创建并执行HSETNX
命令。
13. HVALS
HVALS key
返回哈希表key
中所有域的值。
14. HSCAN
HSCAN key cursor [MATCH pattern] [COUNT count]
15. HSTRLEN
HSTRLEN key field
返回哈希表key
中, 与给定域field
相关联的值的字符串长度(string length
)。
如果给定的键或者域不存在, 那么命令返回0
。
网友评论