Redis 入门 02:键、命名与过期时间
实验基线:Redis 7.4.11,先完成环境准备。除标注为宿主机终端的代码外,Redis 命令在该课指定的 redis-cli 中执行;不复制输出结果作为命令。
学习目标#
设计容易查找的键名,理解 TTL 的单位和返回值,使用 SCAN 渐进遍历,并判断类型错误与空值之间的区别。
原理:键名是应用协议的一部分#
Redis 的键是二进制安全的字符串。冒号只是命名约定,没有真正的目录层级。使用“业务:实体<标识>标识>”能让排障和清理更明确,例如 learn:user<1001>1001>。不同数据类型不能在同一个键上混用。
过期时间属于整个键;本课不使用字段级过期功能。TTL 返回秒,PTTL 返回毫秒,-1 表示没有到期时间,-2 表示键不存在。到期键的删除有惰性与后台机制,不能把 TTL 当作精确到毫秒的业务调度器。
实验:写入、检查与遍历#
UNLINK learn:key:user:1001 learn:key:short
SET learn:key:user:1001 "Alice" EX 120
TYPE learn:key:user:1001
EXISTS learn:key:user:1001
TTL learn:key:user:1001
PTTL learn:key:user:1001
SET learn:key:short demo PX 5000
SCAN 0 MATCH learn:key:* COUNT 10
TYPE 是 string,EXISTS 是 1,TTL 和 PTTL 分别接近 120 与 120000。SCAN 返回“下一游标 + 当前批次键名”。继续用返回的游标执行 SCAN,直到游标为 0;首次返回 0 时此次遍历已经结束。
COUNT 是工作量提示,不保证每次得到 10 个键,也可能得到空批次且游标不为 0。遍历期间有写入时结果可能重复,需要去重;SCAN 不提供静态快照。生产环境避免用 KEYS 扫描大型实例。
实验:覆盖写入会影响 TTL#
SET learn:key:user:1001 "Alice v2"
TTL learn:key:user:1001
EXPIRE learn:key:user:1001 120
SET learn:key:user:1001 "Alice v3" KEEPTTL
TTL learn:key:user:1001
PERSIST learn:key:user:1001
TTL learn:key:user:1001
第一次普通 SET 后 TTL 是 -1,因为覆盖写入清除了原过期时间。EXPIRE 返回 1,KEEPTTL 保留剩余时间,PERSIST 返回 1,最后 TTL 再次为 -1。设置过期失败返回 0 时应检查键是否存在,不能只看网络请求是否成功。
常见错误#
- 用 TTL 读取 PX 设置的毫秒数:应该用 PTTL。
- 把 nil 当字符串缓存:GET 的空响应表示不存在,应用要区分空字符串、缓存空值标记和未命中。
- SCAN 一次后立即结束:必须遍历到游标 0。
- 替换键值却忘记 TTL:优先用 SET ... EX 将写入和有效期一起设置。
练习与参考答案#
创建一个值只在键不存在时写入的 20 秒键,再次尝试写入应该失败:
UNLINK learn:key:once
SET learn:key:once first NX EX 20
SET learn:key:once second NX EX 20
GET learn:key:once
预期 OK、nil、first。NX 表示仅在不存在时设置,XX 表示仅在存在时设置。该技巧可以用于简单去重,但是否足以保证业务幂等要看业务提交和 Redis 写入是否能协调。
清理#
UNLINK learn:key:user:1001 learn:key:short learn:key:once
官方参考#
学习导航#
上一课:Redis 入门 01:学习路线与第一次连接 · 学习目录 · 下一课:Redis 入门 03:String 与 Hash







