高并发下的缓存问题
概要
高并发下的缓存问题主要就是三类: 缓存穿透
, 缓存击穿
, 缓存雪崩
。
缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决方案
- 缓存空对象 当数据库查询不到数据的时候,我们将空对象缓存到 Redis 中,这样下次请求的时候,就可以直接从缓存中获取到空对象,而不需要再次查询数据库。但是需要注意:
为空对象设置合理的有效期, 避免影响正常业务
- 布隆过滤器 布隆过滤器的核心特性:
返回不存在的一定不存在, 返回存在的可能不存在
, 这里只要利用一定不存在的这个特性, 即可过滤的量非法请求.
缓存击穿
缓存击穿是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一
个洞。
解决方案
设置热点数据永远不过期
redis缓存, 建议设置过期时间, 这里所谓的永不过期指的是:
增加后台任务,在缓存即将过期时,刷新缓存
, 当然, 也可以设置值永不过期, 但需要记得, 当这个key这个呀不变味非热点数据时, 记得清理数据
加互斥锁
缓存不存在时, 先获取锁, 再从数据库中获取数据, 然后将数据写入缓存, 最后释放锁. 未获取到锁的请求, 等待一段时间后再重新获取锁.
缓存雪崩
缓存雪崩是指在同一时段 大量的缓存 key 同时失效或者 Redis 服务宕机,导致大量请求到达数据库,带来巨大压力
。
解决方案
- 错峰过期 缓存数据的过期时间设置随机(基础过期时间 + 随机波动),防止同一时间大量数据过期现象发生。
- 给缓存业务添加降级限流策略 此策略是服务层面的, 和redis本身无关
总结
维度 | 缓存穿透 | 缓存击穿 | 缓存雪崩 |
---|---|---|---|
触发条件 | 查询不存在的数据 | 单个热点数据过期 | 大量缓存同时失效 |
影响范围 | 特定不存在key | 单个key | 大量key或整个缓存层 |
防御重点 | 非法请求过滤 | 并发控制 | 系统容灾能力 |
类比场景 | 大量查询id=-1的商品详情 | 抢购秒杀 | 服务器集体宕机 |