哈希Hash
哈希类型指键值本身又是一个键值对结构,如value={{field1,value1},…{fieldN,valueN}}。哈希的映射关系叫field-value,注意,这里的value是指field对应的值,不是键对应的值。
常用命令
设置值:hset key filed value,也可以使用hsetnx用于添加,和set与setnx的关系一样,但作用域为field。
获取值:hget key filed,如果键或field不存在,返回nil
删除值:hdel key filed [field…],返回结果为成功删除field的个数
计算field个数:hlen key
批量设置或获取field-value:
hmget key field [field …]
hmset key field value [field value …]
判断field是否存在:hexists key field
获取所有field:hkeys key
获取所有value:hvals key
获取所有field-value:hgetall key
注意,当hash元素较多时,hgetall可能会造成Redis阻塞,建议要获取多个,可以使用hmget,如果一定要获取全部filed-value,可以使用hscan命令,采用渐进式遍历哈希类型
自增指定数字/浮点数字
hincrby key field
hincrbyfload key field
计算value字符串长度
hstrlen key field
哈希类型命令的时间复杂度,开发人员可以参考此表选择适合的命令
命令 |
时间复杂度 |
hset key field value |
O(1) |
hget key field |
O(1) |
hdel key field [field …] |
O(k),k是field个数 |
hlen key |
O(1) |
hgetall key |
O(n),n是field总数 |
hmget field [field …] |
O(k),k是field个数 |
hmset field value [field value…] |
O(k),k是field个数 |
hexists key field |
O(1) |
hkeys key |
O(n),n是field总数 |
hvals key |
O(n),n是field总数 |
hsetnx key field value |
O(1) |
hincrby key field increment |
O(1) |
hincrbyfloat key field increment |
O(1) |
hstrlen key field |
O(1) |
内部编码
哈希类型的内部编码有两种:
- ziplist:压缩列表,当hash类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节),Redis使用ziplist作为内部实现,更加紧凑,节省内存。
- hashtable:哈希表。当无法满足ziplist要求时,使用hashtable,因为此时ziplist读写效率会下降,而hashtable的读写时间复杂度为O(n)
使用场景
Hash类型和关系型数据库的不同之处:
- Hash类型是稀疏的,关系型数据库是完全结构化的
- 关系型数据库可以做复杂查询,Redis不适合模拟关系型复杂查询,维护成本太高