1.什么是缓存穿透
缓存穿透是指请查询一个不存在的数据,如果在数据库中查不到数据则不写入缓存,之后的每次请求都会直接访问数据库,导致数据库压力过大。
解决办法:
(1).缓存空数据,如key:1,value:null,查询返回的数据为空
优点:使用简单
缺点:占用Redis内存,可能会产生读写不一致问题
(2).在查询Redis前,使用布隆过滤器来检索一个元素是否在集合中。布隆过滤器的底层是先初始化一个大数组,存放二进制0或1.当一个key来了后,经过三次hash计算,模与数组长度找到数据的下表,将数组中原来的0改为1,也就是三个数组的位置确定一个key的存在。
优点:内存占用少,没有多余key
缺点:存在误判率,我们一般设置这个误判率不超过5%。
2.什么是缓存击穿
缓存击穿是指对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时候大量的并发请求访问这个key,此时会直接访问数据库并加载数据回设缓存,但高并发的请求可能会瞬间把数据库压垮。
解决办法:
(1):使用互斥锁,当缓存失效时,不立即去访问数据库,先使用setnx设置一个互斥锁,然后访问数据库,当操作成功返回时,回设缓存。锁期间其他请求无法访问。具有强一致性,性能较差,可能会产生死锁。
(2):设置key逻辑过期,在设置key的时候,设置一个过期时间字段存入缓存,不给当前key设置真正的过期时间,当查询时,从Redis中取出数据后,先判断时间是否过期。如果过期,开启另外一个线程同步数据,当前线程正常返回数据。但这种方法可能会造成数据不一致。
3.什么时缓存雪崩?
缓存雪崩是指大量key都设置了同一个过期时间,同时失效时,请求全部访问数据库,数据库压力过重雪崩。
解决办法:
(1):将缓存失效时间错开,例如在原有失效时间上随机增加1到5分钟,重复率大大降低,这样就很难同时失效大量缓存