~/VibeHandbook
免费 PDF

数据库

redis.io

Redis

是什么

设想一下:把此刻需要的便签放在面前的桌上,而不是每次都走到文件柜去拿——快得多,但一断电桌面就清空了。Redis 就像那张桌子:它把数据放在快速的工作内存(RAM,随机存取存储器)里,而不是磁盘上,所以读写极快。需要时它也可以保存到磁盘。它本质上是一个键值存储,但支持丰富的数据结构,如列表、集合、有序集合、哈希和流。它最常作为缓存、会话存储、队列或限流器,与主数据库配合使用。

优势

  • 得益于内存运行,延迟低至亚毫秒级。
  • 结构多样:字符串、哈希、列表、集合、有序集合、流。
  • 内置 TTL(存活时间)/过期机制——每个条目可在设定时间后自动删除自己——非常适合缓存和会话。
  • 原子操作和 Lua 脚本可用于实现安全的计数器和锁。
  • 发布/订阅和流支持消息传递与事件管道。

权衡取舍

  • 数据受可用内存限制;大数据集成本高昂。
  • 持久化是可选的,崩溃时可能丢失最近的写入。
  • 不能替代持久化的关系型存储。
  • 集群为分片和故障转移带来了运维复杂度。

何时使用

使用 Redis 来缓存代价高昂的查询结果、存储会话、实现限流、管理任务队列、构建排行榜或传递实时消息。务必将其与一个持有真实数据来源的持久化数据库搭配使用。

与 vibe coding 的契合度

在指挥 AI 时,要明确指出 Redis 是缓存或辅助存储,而非系统的记录源。因此它应当始终为缓存条目设置 TTL。它还应当设计清晰的键命名方案(例如 user:123:profile)。要求 AI 使用 INCR 这样的原子命令来做计数器、用 SET ... NX EX 来做锁,而不是使用可能产生竞态的读-改-写序列。一个好建议:让 AI 使用 cache-aside 模式。简单说就是:先查缓存;如果没有,就从数据库取;然后把它存进缓存,供下次使用。还要让 AI 说明它的失效策略——也就是如何清除陈旧、过时的数据——以免不再有效的数据残留。

# 缓存一个值,1 小时后过期
SET user:123:profile "{\"name\":\"Ada\"}" EX 3600

# 原子的限流计数器
INCR rate:ip:203.0.113.5
EXPIRE rate:ip:203.0.113.5 60

# 分布式锁:仅当不存在时设置,自动过期
SET lock:job:42 "owner-a" NX EX 30

# 用有序集合做排行榜
ZADD leaderboard 4200 "player:7"
ZREVRANGE leaderboard 0 9 WITHSCORES