缓存击穿是什么?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发请求的用户特别多(就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况),当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞,引起数据库压力瞬间增大,造成过大压力。
解决方式
- 可以将热点数据设置为永远不过期;
- 基于 redis 或者 zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
ps: 如果我们将大量热点商品的数据缓存在了nginx,而一般nginx的缓存都会设置过期时间,为了避免大量缓存同时过期导致大量的请求回到redis中去查询,我们可以在nginx设置缓存的时候设置不同的过期时间。