一个键里装多对字段值、改写其一部分更便宜的数据结构。

Redis 哈希把相关字段收拢在一个键下

Redis 哈希把多个字段名及其字节值放在一个键下,适合按属性独立读取或修改的对象,例如拥有姓名和积分的用户资料。HGET 与 HSET 各自都只需要一条命令,并不会因为多了一层字段组织,就天然比字符串多一次网络往返。类型选择的依据是实际访问粒度,而不是把内部结构想象成额外的远程查询。 只读取和更新目标字段 HGET 获取一个字段,HMGET 按请求顺序获取指定字段,HGETALL 则返回所有字段和值。Redis 不会自动把某个字段值解释为嵌套对象,不会把带点的字段名当作对象路径,也不会自动为任意属性组合建立查询索引。字段如何命名、值如何序列化,仍然由应用负责。 HSET 可以在一条命令里写多个字段,未指定的字段不会被替换。它的整数返回值统计新增字段数,而不是所有发生变化的值:更新已有字段即使成功,也可以返回零。HDEL 返回实际删除的字段数;最后一个字段删除后,整个哈希键也会消失。因此,不能用一个没有字段的哈希作为长期存在的占位对象。 字段缺失和空值是两种状态。redis-py 关闭自动解码时,HMGET 对缺失字段返回 None,对已存在但内容为空的字段返回空字节串。直接用真假值判断会混淆两者,应按明确的返回值区分。HGETALL 对小对象很方便,但处理量和响应大小会随整个哈希增长;调用方只需要几个属性时,应该直接读取这些字段,避免每次搬运全部数据。 过期时间分为两层 键级过期会删除整个哈希,HSET 会保留该键已有的截止时间。从 Redis 7.4 开始,还可以通过 HEXPIRE 和 HPEXPIRE 给单个字段设置期限。普通 HSET 覆盖字段时会清除这个字段自己的过期时间,HINCRBY 则保留被修改字段的已有期限。字段 TTL 返回 -1,只表示它没有独立的字段期限,不代表它能逃过父键到期后整体删除。 Redis 8.0 及更新版本提供 HSETEX,可以把字段值与字段期限放在同一条命令里写入;其 KEEPTTL 选项能在替换字段值时保留已有字段截止时间。先 HSET、再 HPEXPIRE 仍然是两条操作,中间失败会产生值已经变更、期限尚未附加的窗口。应根据希望保留、重置还是新建期限来选命令,并在采用字段过期能力前核对实际部署版本,不能把键级与字段级期限混为一谈。 ...

三月 13, 2027 · 3 分钟 · XB Field Notes