面试题答案
一键面试缓存击穿在Redis多维度限流存储结构优化场景下的表现
当有一个热点数据(例如某个热门商品的抢购接口对应的限流数据),在其缓存过期的瞬间,大量的请求同时访问该数据,由于缓存中没有该数据,这些请求会直接穿透到后端数据库(或其他限流策略存储处),可能导致数据库压力剧增甚至崩溃,进而影响整个系统的稳定性。
解决方案及优缺点分析
- 互斥锁方案
- 实现方式:在缓存失效时,先获取一把互斥锁(例如使用Redis的SETNX命令),只有获取到锁的请求才能去查询后端数据并更新缓存,其他请求则等待。获取锁的请求更新完缓存后释放锁,其他等待的请求再次尝试获取锁,此时缓存已更新,可直接从缓存获取数据。
- 优点:
- 实现相对简单,易于理解和编码。
- 能有效防止大量请求同时穿透到后端,减轻后端压力。
- 缺点:
- 性能问题,由于需要等待获取锁,会增加请求的响应时间。
- 可能存在死锁风险,如果获取锁的线程在更新缓存前出现异常,未能释放锁,会导致其他线程一直等待。
- 热点数据永不过期方案
- 实现方式:对于热点数据设置一个较长的过期时间,或者不设置过期时间。同时在后台开启一个定时任务(例如使用Redis的发布订阅机制或外部定时任务框架),定期去更新这些热点数据的缓存。
- 优点:
- 不会出现缓存击穿问题,因为热点数据一直存在于缓存中。
- 性能较好,请求无需等待锁,可直接从缓存获取数据。
- 缺点:
- 占用较多的缓存空间,因为热点数据长时间不释放。
- 数据可能存在一定时间的不一致性,从定时任务更新缓存到下次更新之间,数据可能是旧的。
- 二级缓存方案
- 实现方式:设置两级缓存,一级缓存为常用的快速缓存(如Redis),二级缓存为相对慢一些但容量较大的缓存(如Memcached或本地缓存)。当一级缓存失效时,先从二级缓存获取数据,如果二级缓存也没有,则查询后端数据并同时更新一级和二级缓存。
- 优点:
- 降低了直接穿透到后端的风险,因为有二级缓存兜底。
- 可以根据业务需求灵活调整两级缓存的策略,例如设置不同的过期时间等。
- 缺点:
- 增加了系统复杂度,需要维护两级缓存的一致性。
- 由于涉及到两级缓存的查询,可能会增加一定的响应时间。