一. 前言
目前大部分面向公众用户的互联网系统,它的并发请求数量是和在线用户数量正相关的,而 MySQL 能承担的并发读写的量是有上限的,当系统的在线用户超过几万到几十万这个量级的时候,单台 MySQL 就很难应付了。
绝大多数互联网系统,都使用 MySQL 加上 Redis 这对儿经典的组合来解决这个问题。Redis 作为 MySQL 的前置缓存,可以替 MySQL 挡住绝大部分查询请求,很大程度上缓解了 MySQL 并发请求的压力。
那么使用Redis时可能会遇到一些问题,其中缓存穿透以及缓存中数据与db数据的一致性问题是我们需要重点关注的问题。本篇文章先分析下缓存穿透,以及其解决思路是什么。
缓存的更新以及数据一致性问题放在这篇文章中讲解。
二. 缓存穿透
1.什么是缓存穿透?
缓存穿透其实是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。少量的缓存穿透不可避免,对系统也是没有损害的。
我们需要预防的是,短时间内大量的请求无法命中缓存,请求穿透到数据库,导致数据库繁忙,请求超时。大量的请求超时还会引发更多的重试请求,更多的重试请求让数据库更加繁忙,这样恶性循环导致系统雪崩。
2.缓存穿透的解决方案
一般来说我们会有两种解决方案: