2.1 通用命令与 Key 设计
本章目标:掌握对所有数据类型都适用的通用命令,学会像老手一样给 key 命名。
1. 为什么先讲这个?
Redis 有五大数据类型,但有一批命令是不管什么类型都能用的——它们操作的是 key 本身,而不是 key 里面的值。先学会这批命令,后面每种类型就只需要关注它自己的专属命令了。
2. 通用命令一览
增删查
127.0.0.1:6379> set article:1 "hello"
OK
# 是否存在
127.0.0.1:6379> exists article:1
(integer) 1
# 删除(可以一次删多个,返回实际删除的个数)
127.0.0.1:6379> del article:1 article:2
(integer) 1
# 查看类型
127.0.0.1:6379> type article:1
string
重命名
127.0.0.1:6379> set oldname "data"
OK
127.0.0.1:6379> rename oldname newname
OK
设置过期时间(重点!)
Redis 的 key 可以设置"保质期",到期自动删除。这是缓存场景的基石:
# 设置 key 10 秒后过期
127.0.0.1:6379> set code 8888
OK
127.0.0.1:6379> expire code 10
(integer) 1
# 查看还剩几秒(TTL = Time To Live)
127.0.0.1:6379> ttl code
(integer) 7
# 10 秒后再看
127.0.0.1:6379> ttl code
(integer) -2 # -2 表示 key 已经不存在了
127.0.0.1:6379> get code
(nil)
ttl 的三种返回值必须记住:
| 返回值 | 含义 |
|---|---|
| 正整数 | 剩余存活秒数 |
-1 | key 存在,但永不过期(默认状态) |
-2 | key 不存在(可能已过期被删,也可能从没存在过) |
相关命令:
pexpire key 5000 # 以毫秒为单位设置过期
persist key # 移除过期时间,变为永久
set code 8888 EX 60 # set 时直接带上过期时间(推荐写法,原子操作)
💡 实际工作中,绝大多数缓存 key 都应该设置过期时间。永久 key 越攒越多,内存迟早爆掉。
遍历 key:用 SCAN 而不是 KEYS
上一章说过 keys * 会阻塞 Redis。生产环境的正确做法是 scan,它每次只返回一小批,分多次遍历完:
# 从游标 0 开始,匹配 user:* 的 key,每批约 100 个
127.0.0.1:6379> scan 0 match user:* count 100
1) "0" # 返回的新游标,为 0 表示遍历结束
2) 1) "user:1:name"
2) "user:2:name"
用法:拿着返回的游标继续 scan <游标>,直到游标为 0。新手阶段了解即可,知道"生产环境用 scan"这个结论最重要。
3. Key 的命名规范(非常重要)
Redis 没有表、没有库结构,所有 key 都平铺在一起。如果命名随意,项目一大就是灾难。业界通用的规范是:
用冒号分隔,形成层级
业务名:对象名:ID:属性
示例:
shop:user:1:name → 商城系统,用户1的名字
shop:user:1:profile → 商城系统,用户1的资料
shop:product:100:stock → 商城系统,商品100的库存
blog:article:55:views → 博客系统,文章55的阅读量
这样做的好处:
- 一眼看懂这个 key 存的是什么
- 不会冲突:用户表和商品表的 ID 都是 1 也没关系(
user:1vsproduct:1) - 方便按前缀批量查找:
scan 0 match shop:user:* - 很多可视化工具(如 RedisInsight、Another Redis Desktop Manager)会把冒号识别为目录层级,展示成树形结构
其他命名建议
- key 不要太长(浪费内存,建议 100 字符以内),也不要太短失去可读性(
u:1:n就过头了) - 只用小写字母、数字、冒号、下划线、点
- 同一个项目统一风格,最好写进团队文档
4. 动手练习
- 创建 key
sms:code:13800138000,值为6666,并设置 60 秒过期(提示:用set ... EX 60一条命令完成) - 用
ttl观察它的剩余时间 - 用
persist把它变成永久,再用ttl确认返回-1 - 思考:验证码场景为什么必须设置过期时间?
5. 小结
- 通用命令:
exists/del/type/rename/expire/ttl/persist/scan ttl返回-1是永不过期,-2是不存在- 缓存 key 尽量都设置过期时间
- key 命名用
业务:对象:ID:属性的冒号分层格式
下一章开始学第一个、也是最常用的数据类型 👉 2.2 字符串 String