👋 Hi,带娃的我热爱AI 大模型应用落地、意识解码与 AI 开发工具链。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >
缓存不该困在一台服务器里:写给新手的分布式缓存入门指南
① 这份清单何时用
如果你遇到过下面这些情况,这篇文章就是为你写的:
- 你写了一个小项目,用本地内存(比如 Java 的
HashMap、Python 的dict)缓存热点数据,单机跑得飞快; - 老师或面试官问:“如果部署两台服务器,缓存怎么办?”你答不上来;
- 你听说过 Redis、Memcached,但不知道它和“本地缓存”差在哪,也不知道该在什么时候切换。
前置知识:会写至少一门后端语言,理解“键值对”和“函数调用”。不需要任何分布式系统经验。
大约耗时:读完 15 分钟,跟着最小可行集动手约 40 分钟。
你能收获什么:一段可以写进作品集的能力——“我知道本地缓存的边界在哪里,并且能用 Redis 搭出一个两台机器共享缓存的 Demo。”这个能力在校招和实习面试里,比“我会背 Redis 八股”更有说服力。
② 快速总表
把下面这张表当作你的检查目录。每一项都能回答“通过 / 不通过”。
| 分组 | 检查项 | 一句话判断标准 |
|---|---|---|
| 正确性 | 缓存与数据源一致性 | 数据更新后,读到的不是旧值 |
| 正确性 | 缓存穿透防护 | 查不存在的数据,不会每次都打到数据库 |
| 性能 | 命中率可观测 | 能说出当前命中率是多少 |
| 性能 | 网络往返可控 | 单次缓存读取延迟在毫秒级 |
| 安全 | 缓存不存敏感明文 | 密码、token 不以明文进缓存 |
| 可运维 | 缓存可独立重启 | 重启缓存不影响主服务启动 |
| 可运维 | 有失效策略 | 每个键都有 TTL 或明确的淘汰规则 |
③ 分组详解
正确性:缓存不能“撒谎”
判断标准:数据库里的值改了,下一次读必须拿到新值,而不是缓存里的旧值。
怎么检查:手动改一次数据库,再调一次读接口,看返回值。
不通过怎么处理:最常见的是“更新数据库后忘了删缓存”。入门阶段用最简单的策略——写数据库后直接删除对应缓存键(而不是更新它)。删除比更新更不容易出错。
# 伪代码:写路径defupdate_user(user_id,new_name):db.execute("UPDATE users SET name=? WHERE id=?",new_name,user_id)cache.delete(f"user:{user_id}")# 关键一步面试常被追问:“先删缓存还是先写数据库?”入门阶段记住结论即可:先写数据库,再删缓存。更复杂的延迟双删属于进阶话题。
正确性:防止缓存穿透
判断标准:请求一个数据库里根本不存在的 ID,不会每次都打到数据库。
怎么检查:用不存在的 ID 连续请求 100 次,看数据库日志里是否出现 100 次查询。
不通过怎么处理:把“空结果”也缓存起来,TTL 设短一点,比如 60 秒。
性能:命中率必须能看见
判断标准:你能回答“过去一小时缓存命中率是多少”。
怎么检查:Redis 自带INFO stats命令,看keyspace_hits和keyspace_misses。
不通过怎么处理:如果命中率长期低于 60%,说明缓存的数据选错了。优先缓存“读多写少、且重复读取率高”的数据,比如用户资料、商品分类,而不是每次都不同的订单流水。
安全:别把缓存当保险箱
判断标准:缓存里不出现明文密码、完整身份证号、未加密的 token。
怎么检查:连上 Redis,KEYS *看一眼键名和值(仅限自己的测试环境)。
不通过怎么处理:敏感字段要么不缓存,要么在写入前脱敏。记住:缓存服务通常没有数据库那样严格的权限体系。
可运维:缓存要能独立生死
判断标准:关掉缓存服务,主服务还能启动、还能降级返回数据库结果。
怎么检查:手动停掉 Redis,重启你的应用,看是否报错崩溃。
不通过怎么处理:在代码里对缓存读取做 try/except,缓存挂了就回退到数据库。这是从“玩具项目”走向“能演示的项目”的关键一步。
④ 最小可行集
时间不够时,按顺序做这 5 件事:
- 装一个 Redis:用 Docker 一行命令
docker run -p 6379:6379 redis:7,看到Ready to accept connections就算成功。 - 把一处本地缓存换成 Redis:选你项目里最热的一个读接口,把
dict换成 Redis 的GET/SET,跑通一次读。 - 加上写后删除:写数据库的地方补一行
cache.delete(key)。 - 加 TTL:给每个键设 300 秒过期,防止脏数据永久残留。
- 打印命中率:调一次
INFO stats,把命中率截图放进你的项目 README。
做完这 5 步,你就拥有了一个“两台服务器可以共享缓存”的最小系统。它不完美,但它是真的。
⑤ 附录
常用命令
# 启动 Redis(Docker)dockerrun-d--namemy-redis-p6379:6379 redis:7# 进入命令行dockerexec-itmy-redis redis-cli# 查看命中率INFO stats# 查看所有键(测试环境)KEYS *TTL 设置模板
cache.set(key,value,ex=300)# 300 秒后自动过期面试/作业常被追问的点
- 本地缓存和分布式缓存各自的优缺点是什么?
- 缓存雪崩、缓存击穿、缓存穿透分别指什么?
- 为什么推荐“删除缓存”而不是“更新缓存”?
这些问题不需要一次答完美,但你要能说出“我知道它们存在,并且知道入门阶段先用最简单的删除策略”。诚实比背诵更打动人。