ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Redis 的 hash 是什么?

Redis 的 hash 是什么? Redis HashRedis Hash 是key‑field‑value结构类比 Java 的HashMap。外层是 Redis 的大 key内部每个 hash 里面有多个 field‑valuefield不能重复。底层两种实现1. ziplist压缩列表小hash当同时满足两个条件元素数量小于hash‑max‑ziplist‑entries默认512每个field和value字符串长度小于hash‑max‑ziplist‑value默认64字节使用压缩列表ziplist存储。连续内存节省空间读写性能不错。2. dict哈希表大hash一旦超过上面阈值自动转成dict也就是真正哈希表。底层数组链表发生哈希冲突链表法解决。注意是 Redis 自己实现的 dict不是JDK HashMap。常用命令hset user:100 name zhang age23hget user:100 name hgetall user:100 hincrby user:100 age1hkeys / hvals hexists使用场景存储对象对比把整个对象序列化为StringString修改一个字段需要取出整个对象反序列化改再序列化写回。Hashhset直接更新某一个 field局部修改不用操作全部数据。适合用户信息、商品基础信息。⚠️ 缺点hgetall会取出全部fieldhash很大时不要随便执行hgetall容易阻塞。面试坑点Hash不能设置过期时间针对单个field过期只能对整个hash key设置expire单个field做不到过期。如果要局部字段过期不能用hash。ziplist适合少量短数据数据变大自动转dict不要存海量大value。和String选型对象字段经常局部更新优先hash对象整体频繁读写优先String序列化。总结Redis Hash是field‑value的哈希结构底层小数据用ziplist压缩列表大数据转为dict哈希表适合存储对象可以单独修改某个字段但不支持field级别的过期。口述简短版Redis Hash类似HashMap结构是key下面多个field‑value。数据量小的时候用压缩列表节省内存数据多切换到哈希表。适合存用户这种对象可以单独更新某一个字段不用序列化整个对象。但是注意它只能给整个key设置过期不能单独给某个field过期。
返回列表