缓存击穿也叫热点Key问题,指的是对于设置了过期时间的key,在某个时间点过期以后,恰好有大量的key并发的请求过来。这些请求发现缓存过期,一般都会从DB中加载数据并缓存到Redis中。容易对数据库造成巨大的压力,同时可能会导致数据库和缓存不一致的情况。
解决方案:1.使用互斥锁: 当缓存失效时,不要去立马去load db,而是使用Redis的setnx设置一个互斥锁。要求拿到该互斥锁的线程进行缓存重建。其他没拿到的进程进行重试该方法,知道get到缓存。(分布式锁)
2.使用逻辑过期。在设置一些热点key的时候,设置一个过期字段一并加到缓存中,不设置过期时间。 当查询时,判断此key是否过期,如果过期,则开通另一个线程进行缓存重建,当前线程返回旧数据。
当然两个方案各有利弊,如果要数据的强一致性,则建议使用分布式锁的方案。
如果考虑高可用性,则建议使用逻辑过期方案。