Redis hash 用一个键装多个字段
Redis hash 是一个键下面可按字段访问的记录,不是自动校验模式的对象,也不是天然支持嵌套路径的文档。当调用方只需要部分属性、又不想替换整条记录时,它很有用。但是否划算取决于访问模式、字段大小和返回值语义,而不是只要选择 hash 类型,就自动得到廉价读写或完整业务一致性。 只读取调用方真正需要的字段 HGET 获取一个字段,HMGET 按请求顺序获取选定字段,HGETALL 则返回整个映射。在 redis-py 的二进制响应模式下,缺失字段表示为 None,存在但为空的值表示为空字节串。直接判断真假会把这两种情况错误地合并;对不存在的键执行 HMGET,同样得到对应位置的缺失值,并不会自动创建 hash。 字段名和字段值本质上都是字节。名字中含点号仍是字面名称,Redis 不会把 name.first 解释为进入嵌套对象再找 first。同样,包含 JSON 文本的字符串键还是字符串,HGET 不会替你解析 JSON。序列化和内容校验属于应用职责,“没有提供属性”和“明确写入空值”也应保留区别。 更新操作有精确的返回语义 HSET 只修改指定字段,未指定的字段保持不变。一次多字段 HSET 是一个命令,但其整数回复统计新增字段数量,而不是成功修改的总数。替换已有 name 完全可能成功返回零;如果把零视为失败,就会制造多余重试、错误告警,甚至触发不必要的补偿动作。 HINCRBY 在一个命令内完成整数递增,字段不存在时从零开始,拒绝非整数值以及超出有符号六十四位范围的结果。它避免的是这一项递增的读改写竞争,并不把外围的业务检查也变为原子操作。分别执行 HGET、在客户端计算、再执行 HSET,仍可能覆盖其他客户端已完成的修改。 HDEL 的返回值统计实际删除的字段,删除最后一个字段会让整个键消失。因此,不能靠空 hash 长期占位,表示某条实体存在。键级过期同样会删除其字段;当前 Redis 还支持字段级截止时间,不能沿用“hash 字段绝对不能单独过期”的旧结论。下面的实验没有设置任何过期时间,也不把结果作为生命周期验证。 ...