平日学习当中遇到一道面试题,讲的就是Redis的缓存击穿问题。因为还没有在项目中熟悉使用redis,只是知道redis主要用作缓存,所以还是不太清楚这道题的答案的。经查阅资料,明白了Redis缓存击穿是个怎么回事儿。
Redis的缓存击穿是指在高并发情况下,某个热点数据过期失效后,大量请求同时涌入,导致这些请求直接访问后端存储系统(如数据库),增加了数据库的负载。
具体来说,当一个热点数据在缓存中过期时,如果此时有大量的请求访问这个热点数据,这些请求会直接穿过缓存层直接访问后端存储系统。由于数据库的压力突然增加,可能导致数据库负载过高,甚至出现宕机或性能下降等问题,从而影响系统的稳定性和性能。
为了解决缓存击穿问题,可以采取以下几种方法:
- 热点数据永不过期:对于热点数据,可以设置永不过期,或者设置较长的过期时间,以确保数据始终在缓存中有效。
- 加锁:在数据失效时,通过加锁机制防止大量请求同时访问后端存储系统,只允许一个线程去加载数据到缓存中,其他线程等待缓存数据加载完成后再访问。
- 使用互斥锁:当发现热点数据即将过期时,使用互斥锁机制保证只有一个线程去重新加载数据到缓存中,其他线程等待直到数据加载完成。
- 缓存穿透检测:针对缓存穿透,即查询一个不存在的数据,可以使用布隆过滤器等技术进行预检查,避免直接查询后端存储系统。
- 降级处理:当后端存储系统负载过高时,可以采取降级策略,如返回默认值或错误提示,保证系统的可用性。