Redis-Hash类型
字符串和哈希是有很明显的区别:
哈希类型中的映射关系通常为 field-value ,是用来区分 Redis 整体的键值对
以下只介绍基本的命令,方便直接使用
命令
HSET
设置 hash 中指定的字段的值 字段:field 值:value
# 括号内的不是必须项
hset key field value {field value……}
时间复杂度: O(N) N表示插入的N组field
返回值: 添加的字段的个数
例子:
HGET
获取 hash 中指定字段的值
hget key field
时间复杂度: O(1)
返回值: 对应 key 中对应 field 的值,如果找不到key或者field就会返回 nil
例子:
HMGET
一次性获取 hash 中的多个字段的值
hmget key field {key field}
时间复杂度: O(N) N表示查询的元素个数
返回值: 字段对应的值,如果没有该字段就会返回 nil
HGETALL
获得hash中的所有字段以及对应的值
hgetall key
时间复杂度: O(N) N表示有N组field
返回值: 所有的字段和值
不过需要注意的是: 使用 HGETALL 时,元素过多可能会造成阻塞
此时就需要判断到底是使用 HETALL 还是使用 HMGET
HEXISTS
判断 hash 中是否有指定的字段(field)
hexists key field
时间复杂度: O(1)
返回值: 1 表示存在, 0 表示不存在
例子:
HDEL
删除 hash 中指定的字段
hdel key field {field……}
时间复杂度: O(N) N表示要删除的字段的个数
返回值: 本次操作被删除的字段个数
例子:
HKEYS
获取 hash 中的所有字段名(没有值)
hkeys key
时间复杂度: O(N) N为hash中field的个数
返回值: 对应的所有字段,字段列表
HVALS
获取 hash 中的所有的值
hvals key
时间复杂度: O(N) N表示对应的key中的field的个数
返回值: 所有的值
HLEN
获取 hash 中的所有字段的个数
hlen key
时间复杂度: O(1)
返回值: 字段的个数
HSETNX
在字段不存在(必须不存在)的情况下,设置 hash 中的字段和值
hsetnx key field value
时间复杂度: O(1)
返回值: 1 表示设置成功, 0 表示失败
HINCRBY
将 hash 中字段对应的数值添加指定的值
hincrby key field increment
时间复杂度: O(1)
返回值: 操作成功之后的值
HINCRBYFLOAT
修改的数值为浮点型
hincrbyfloat key field increment
时间复杂度: O(1)
返回值: 操作成功之后的值
命令总结
命令 | 执行结果 | 时间复杂度 |
hset key field value | 设置值 | O(1) |
hget key field | 获取值 | O(1) |
hdel key field [field ...] | 删除field | O(k), k是field个数 |
hlen key | 计算field个数 | O(1) |
hgetall key | 获取所有的field-value | O(k), k是field个数 |
hmget field [field ...] | 批量获取field-value | O(k), k是field个数 |
hmset field value [field value ...] | 批量设置field-value | O(k), k是field个数 |
hexists key field | 判断field是否存在 | O(1) |
hkeys key | 获取所有的field | O(k), k是field个数 |
hvals key | 获取所有的value | O(k), k是field个数 |
hsetnx key field value | 设置值(仅当field不存在时成功) | O(1) |
hincrby key field n | 对field的value增加整数n | O(1) |
hincrbyfloat key field n | 对field的value增加浮点数n | O(1) |
hstrlen key field | 计算value的字符串长度 | O(1) |
内部编码
哈希表内部有两种内部编码
-
Ziplist: 当 field 个数较少且没有较大的 value
-
Hashtable: 当有 value 大于 64 字节
-
同时如果 field 个数超过 512 个也会转变为 hashtable