Skip to content

高并发下的缓存问题

约 765 字大约 3 分钟

缓存

2025-05-19

概要

高并发下的缓存问题主要就是三类: 缓存穿透, 缓存击穿, 缓存雪崩

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决方案

  • 缓存空对象 当数据库查询不到数据的时候,我们将空对象缓存到 Redis 中,这样下次请求的时候,就可以直接从缓存中获取到空对象,而不需要再次查询数据库。但是需要注意: 为空对象设置合理的有效期, 避免影响正常业务
  • 布隆过滤器 布隆过滤器的核心特性: 返回不存在的一定不存在, 返回存在的可能不存在 , 这里只要利用一定不存在的这个特性, 即可过滤的量非法请求.

缓存击穿

缓存击穿是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一
个洞。

解决方案

  • 设置热点数据永远不过期

    redis缓存, 建议设置过期时间, 这里所谓的永不过期指的是: 增加后台任务,在缓存即将过期时,刷新缓存, 当然, 也可以 设置值永不过期, 但需要记得, 当这个key这个呀不变味非热点数据时, 记得清理数据

  • 加互斥锁

    缓存不存在时, 先获取锁, 再从数据库中获取数据, 然后将数据写入缓存, 最后释放锁. 未获取到锁的请求, 等待一段时间后再重新获取锁.

缓存雪崩

缓存雪崩是指在同一时段 大量的缓存 key 同时失效或者 Redis 服务宕机,导致大量请求到达数据库,带来巨大压力

解决方案

  • 错峰过期 缓存数据的过期时间设置随机(基础过期时间 + 随机波动),防止同一时间大量数据过期现象发生。
  • 给缓存业务添加降级限流策略 此策略是服务层面的, 和redis本身无关

总结

维度缓存穿透缓存击穿缓存雪崩
触发条件查询不存在的数据单个热点数据过期大量缓存同时失效
影响范围特定不存在key单个key大量key或整个缓存层
防御重点非法请求过滤并发控制系统容灾能力
类比场景大量查询id=-1的商品详情抢购秒杀服务器集体宕机

Released under the MIT License.