惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss
Y
Y Combinator Blog
A
About on SuperTechFans
WordPress大学
WordPress大学
B
Blog
Martin Fowler
Martin Fowler
Jina AI
Jina AI
I
InfoQ
P
Proofpoint News Feed
小众软件
小众软件
S
SegmentFault 最新的问题
V
V2EX
B
Blog RSS Feed
量子位
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
美团技术团队

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例)
预防缓存击穿
Jiajun Huang · 2019-12-18 · via Jiajun的技术笔记

预防缓存击穿

一般来说,传说中的高并发解决方案的一大法宝就是使用缓存。没有缓存时,我们的请求是这样的:

(请求) -> (网关) -> (后端应用) -> (数据库)
           /    \<--/         \<--/
(响应) <- /

可以看到,每次都是来一个请求,就查一次数据库。数据库最坏的情况下要在磁盘上查数据,因此当大量流量走向这种情况下的数据库, 数据库就抗不住了,接着就会带着后端应用一起挂。

而当我们使用缓存时,后端应用会先检查是否有缓存,如果有缓存,那么直接返回缓存,否则则查询数据库,并将结果缓存起来留待下次 使用,然后返回数据。

这里有一个漏洞,那就是,如果我知道某个查询无法查到数据,而应用按照上面的逻辑,有结果才缓存,否则不缓存。就可以绕过缓存, 直接把流量打到数据库上了。

预防这种情况的方法也很简单,那就是,就算没有查到结果,也在缓存里记一条。当下次再查询的时候,就还是可以从缓存里拿到一个 “没有结果”的结果了。带来的弊端就是,当数据更新之后,因为缓存里存了”没有结果”,所以拿到的还是没有结果,那咋办呢?解决方案 也挺简单,给缓存结果加TTL(就算是正常的,我们也要加TTL的嘛,不是吗?)。

请注意,这也不是万能的解决方案。更多的还是要在应用层做好校验,尽可能过滤掉本就不存在的数据。否则,因为缓存不存在的东西, 不存在的东西是可以无限构造的,这样的话,挂的可能不是DB,而是缓存了(再多的内存也不够用呀)。

当然了,上面说的这种方式,只是众多缓存策略中的一种,和它所面临的问题。缓存策略还有其他很多种,比如主动缓存等等。只是上面 所说的这种缓存方式比较常用。

没了。