Redis 入门 03:String 与 Hash
实验基线:Redis 7.4.11,先完成环境准备。除标注为宿主机终端的代码外,Redis 命令在该课指定的 redis-cli 中执行;不复制输出结果作为命令。
学习目标#
选择 String 或 Hash 表达业务数据,使用原子计数避免读改写丢失,并识别数字与类型错误。
原理:结构由访问方式决定#
String 可以存放文本、数字文本、JSON 或二进制数据。Redis 不理解普通 JSON 字符串的字段;更新其中一项需要重新序列化整个对象。Hash 把字段映射到值,适合经常独立读写字段的对象。
INCR 和 HINCRBY 是单条原子命令。两个客户端“GET,自己加一,SET”会相互覆盖;两个客户端各调用一次 INCR 能得到两个增量。原子命令并不能把数据库更新也一并纳入事务。
实验:缓存和计数器#
UNLINK learn:model:profile learn:model:views learn:model:user:1001
SET learn:model:profile '{"id":1001,"name":"Alice"}' EX 300
GET learn:model:profile
INCR learn:model:views
INCRBY learn:model:views 9
GET learn:model:views
EXPIRE learn:model:views 3600
GET 返回完整 JSON 文本。两个计数操作依次返回 1 和 10,最后 GET 是字符串形式的 10。对计数器添加 TTL 是为了练习;INCR 与 EXPIRE 是两条命令,执行中断时可能留下无过期键,进阶 Lua 课会解决这个问题。
实验:对象字段#
HSET learn:model:user:1001 name Alice level 1 visits 0
HGET learn:model:user:1001 name
HMGET learn:model:user:1001 name level missing
HINCRBY learn:model:user:1001 visits 1
HGETALL learn:model:user:1001
EXPIRE learn:model:user:1001 600
HSET 首次返回 3,即新增字段数量。HGET 返回 Alice,HMGET 按请求字段顺序返回 Alice、1、nil;HINCRBY 返回 1。HGETALL 返回字段和值,不要依赖字段顺序。
大对象不要每次都用 HGETALL,优先用 HMGET 只读取需要的字段。字符串 key 与 Hash key 的 TTL 都属于整个键,此实验不涉及 Hash 字段过期。
常见错误#
GET learn:model:user:1001
SET learn:model:not-number hello
INCR learn:model:not-number
第一个命令报 WRONGTYPE,因为键是 hash;最后一个报不是有效整数。不要在应用中吞掉异常并返回 0,否则真实类型污染会被隐藏。
字符串整数运算受有符号 64 位范围限制。金额优先用明确单位的整数,不能认为浮点计数适合精确货币计算。
练习与参考答案#
给用户增加积分字段并累加 50,仅读取姓名与积分:
HSET learn:model:user:1001 points 100
HINCRBY learn:model:user:1001 points 50
HMGET learn:model:user:1001 name points
预期 points 为 150。选择题:缓存一个整体读写的接口响应用 String;多个字段独立变更且不需要 JSON 查询时优先 Hash。
清理#
UNLINK learn:model:profile learn:model:views learn:model:user:1001 learn:model:not-number
官方参考#
学习导航#
上一课:Redis 入门 02:键、命名与过期时间 · 学习目录 · 下一课:Redis 入门 04:List、Set 与 Sorted Set







