跳到主要内容

00 通用命令与 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 的三种返回值必须记住:

返回值含义
正整数剩余存活秒数
-1key 存在,但永不过期(默认状态)
-2key 不存在(可能已过期被删,也可能从没存在过)

相关命令:

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的阅读量

这样做的好处:

  1. 一眼看懂这个 key 存的是什么
  2. 不会冲突:用户表和商品表的 ID 都是 1 也没关系(user:1 vs product:1
  3. 方便按前缀批量查找scan 0 match shop:user:*
  4. 很多可视化工具(如 RedisInsight、Another Redis Desktop Manager)会把冒号识别为目录层级,展示成树形结构

其他命名建议

  • key 不要太长(浪费内存,建议 100 字符以内),也不要太短失去可读性(u:1:n 就过头了)
  • 只用小写字母、数字、冒号、下划线、点
  • 同一个项目统一风格,最好写进团队文档

4. 动手练习

  1. 创建 key sms:code:13800138000,值为 6666,并设置 60 秒过期(提示:用 set ... EX 60 一条命令完成)
  2. ttl 观察它的剩余时间
  3. persist 把它变成永久,再用 ttl 确认返回 -1
  4. 思考:验证码场景为什么必须设置过期时间?

5. 小结

  • 通用命令:exists / del / type / rename / expire / ttl / persist / scan
  • ttl 返回 -1 是永不过期,-2 是不存在
  • 缓存 key 尽量都设置过期时间
  • key 命名用 业务:对象:ID:属性 的冒号分层格式

下一章开始学第一个、也是最常用的数据类型 👉 01 字符串 String