Redis常见数据类型(2)Hash
几乎所有的主流编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis
中,哈希类型是指值本身又是⼀个键值对结构,形如 key = “key”,value = { { field1, value1 }, …, {fieldN, valueN } }
哈希类型中的映射关系通常称为 field-value,用于区分 Redis 整体的键值对(key-value),注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下文的作用
常见命令
命令 | 执行效果 | 时间复杂度 |
---|---|---|
hset key field vallue | 设置值 | O(1) |
hget key field | 获取值 | O(1) |
hdel key 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 increment | 对应field-value+n | O(1) |
hincrbyfloat key field n | 对应field-value + n | O(1) |
hstrlen key field | 计算value的字符串长度 | O(1) |
HSET
设置 hash 中指定的字段(field)的值(value)
hset key field value [field value…]
时间复杂度:插入⼀组 field 为 O(1), 插入N 组 field 为 O(N)
返回值:添加的字段的个数
HGET
获取 hash 中指定字段的值
hget key field
时间复杂度:O(1)
返回值:字段对应的值或者 nil
HEXISTS
判断hash中是否有指定的字段
hexists key field
时间复杂度:O(1)
返回值:1 表示存在,0 表示不存在
HDEL
删除hash中指定的字段
hdel key field [field…]
时间复杂度:删除⼀个元素为 O(1). 删除 N 个元素为 O(N).
返回值:本次操作删除的字段个数
HKEYS
获取hash中的所有字段
hkeys key
时间复杂度:O(N), N 为 field 的个数.
返回值:字段列表
HVALS
获取hash中的所有的值
hvals key
时间复杂度:O(N), N 为 field 的个数.
返回值:所有的值
HGETALL
获取hash中的所有字段以及对应的值
hgetall key
时间复杂度:O(N), N 为 field 的个数.
返回值:字段和对应的值
HMGET
一次获取hash中多个字段的值
hmget key field [field…]
时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.
返回值:字段对应的值或者 nil
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
HINCRBY 的浮点数版本
hincrbyfloat key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值
内部编码
哈希的内部编码有两种:
- ziplist(压缩列表):当哈希类型元素个数小于
hash-max-ziplist-entries
配置(默认 512 个)、同时所有值都小于hash-max-ziplist-value
配置(默认 64 字节)时,Redis
会使用ziplist
作为哈希的内部实现,ziplist
使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。 - hashtable(哈希表):当哈希类型无法满足
ziplist
的条件时,Redis
会使⽤ hashtable 作为哈希的内部实现,因为此时ziplist
的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)