缓存基本知识
Publish date: Oct 219, 21029
Last updated: Oct 289, 28089
Last updated: Oct 289, 28089
问
缓存穿透、缓存击穿、缓存雪崩、热点数据失效
答
缓存的作用:
将数据存储在读取速度更快的介质上,让读取尽快完成
在服务器端,通常指数据存在内存中,不用再进行磁盘 I/O 或其他 SQL 操作,节省时间
为了不让缓存发挥作用,我们可以:
缓存穿透
概念
如果每次请求都查询一条数据库中不存在的数据,即缓存和数据库中都查不到此记录,但每次请求都打到数据库上。这种现象称为 缓存穿透
问题
拿一个不存在的 id 去查询数据,使所有请求都打到数据库,使之压力多大而宕
解决
- 缓存空值。将这些 key 对应值为 null 的数据放入缓存中,并设置过期时间,后续请求在一段之间内直接返回 null 即可
- BloomFilter。使用 布隆过滤器 判断 某个元素是否存在于一个集合中。在查询时首先检查 key 是否存在
- 可以首先使用 BloomFilter 过滤掉不存在的 key,然后使用缓存空值的手段
缓存击穿
概念
在 高并发 系统中,大量的请求同时查询一个 key 时,此时该 key 正好失效,就会导致大量请求打到数据库上。这种现象称为 缓存击穿
问题
造成 某一时刻 数据库请求量过大,压力剧增
解决
使用互斥锁。在第一个查询数据的请求上使用一个互斥锁,那么其他请求会等待锁释放。第一个线程查询到数据后做缓存。后面的线程拿到锁后,会发现已有缓存,从而直接取缓存
缓存雪崩
概念
某一时刻发生大规模的缓存失效的情况。比如 缓存服务器宕机,会导致大量请求打到数据库,从而压垮数据库
问题
数据库服务挂掉
解决
- 事前:使用 集群缓存,保证缓存服务的高可用。比如 Redis 的 主从 + 哨兵,Redis Cluster 来避免全盘崩溃
- 事中:ehcache本地缓存 + Hystrix限流&降级,避免数据库被打死。在 Redis 集群服务失效时还可支撑
- 事后:开启 Redis 持久化积滞,尽快恢复缓存集群
热点数据失效
概念
对于一些热点数据来说,当缓存失效后会存在大量请求直接打到数据库,从而可能导致数据库崩溃
问题
数据库崩溃
解决
- 设置不同的失效时间。为了避免热点数据的集中失效,可以在设置过期时间时错开
- 使用互斥锁。在第一个请求查询数据时加上互斥锁以保护数据库,但牺牲了吞吐量