缓存穿透是指查询一个根本不存在的数据,故意去请求缓存中不存在的数据,缓存层和存储层都不会命中,导致所有的请求都怼到数据库上,从而数据库连接异常。通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。
Redis缓存穿透解决方案:
1、使用互斥锁排队 2、布隆过滤器(推荐)
(一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试
(二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。
(三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。
利用布隆过滤器进一步防穿透方案、总结课