Redis【4】—— Hash类型
- 四、各类型指令介绍
- (二)Hash类型
- 1. 基础指令
- 2. 内部编码
四、各类型指令介绍
(二)Hash类型
1. 基础指令
hset k1 f1 v1
hget k1 f1hset k2 f2 v2 f3 v3
hget k2 f2 f3 # error,一次只能返回一个
hget k2 f2
hget k2 f3
hget k3 f2 # key不存在会返回 nil
hget k2 f22 # field不存在也会返回 nil
hexists k1 f1
hexists k1 f11 # field不存在
hexists k3 f3 # key不存在
# del 删除的是整个 hash
# 删除的是field,返回的是删除的个数
hdel k2 f2
hdel k2 f3 hset k2 f22 v22 f33 v33
hdel k2 f22 f33
hset k2 f222 v222 f333 v333 f444 v444
keys *# 注意下方两个指令要慎重使用,因为 field-value 可能有很多
hkeys k1
hkeys k2 # 查看这个key中的所有fieldhvals k1
hvals k2 # 查看这个key中的所有field对于的valuehgetall k1 # 查看这个key所有的 field-value
hgetall k2 hmget k2 f222 f333 # 查看这个key中指定field的value
hmget k2 f222 f333 f444
# hscan 渐进式遍历,连续执行多次就能遍历整个hash,
# 避免了遍历过程中执行时间过程导致的Redis被阻塞
hlen k1 # 获取 hash 元素的个数,时间复杂度是O(1),直接存在起来,不需要遍历
hlen k2 hsetnx k2 f5 v5 # 存在则失败
hget k2 f5
hsetnx k2 f5 v55 # 因为第一次使用hsetnx时不存在,那是正常,存在则失败hset k3 f1 1 f2 2.2
hgetall k3
hincrby k3 f1 10
hincrby k3 f1 -1
hincrbe k3 f2 0.2
hincrbe k3 f2 -0.2
2. 内部编码
hset key f1 111
OBJECT encoding keyhset key f2 222222222222...2222222222
OBJECT encoding key
我们应该怎么理解这里的ziplist
呢?字面上理解这就是 压缩链表,但是怎么理解压缩呢?**压缩的本质是:不同的数据有不同的特点,可以针对数据进行重新编码。举个粗糙的例子,aaaabbbbbbbbcccccc
可以转换成4a8b6c
在哈希的内部编码中ziplist
跟hashtable
的区分并向int
与emstr
那么不明显,那么什么时候ziplist
会编码,什么时候又用hashtable
编码呢?这主要看**hash-max-ziplist-entries**
和 ****hash-max-ziplist-value**
这两个值。默认hash
的个数<512
且value
的字节数<64byte
时才使用ziplist
,当任何一个条件不满足时就会转成hashtable
。