穿透雪崩主要是因为查询数据库造成的,那么读写分离,缓存数据查询失败不去查数据库就好了。查的时候有即是有,无即是无,不会再查数据库,缓存的穿透和雪崩问题就不存在了。其次添加数据库和缓存同步功能,保证数据库和缓存数据是一致的即可(需要注意的是这时候数据库数据是有限和相对稳定的,其实如果是海量数据同时放入缓存这种设计策略,我个人认为本身就有些胡闹)。
缓存穿透问题
现象:请求缓存中么有对对应key的时候去数据库取,大量的缓存穿透可能造出数据库不可用。
解决方法:
1.数据库查询为空,则空值更新缓存(会增加缓存无效值)
2.使用布隆过滤器,对于重复调用进行拒绝访问(会产生误判和逻辑复杂度)
缓存雪崩问题
现象:缓存失效,请求直接到DB上导致DB不可用
解决方案:key不失效;key失效时间错开;分布式多活
总结
缓存的穿透和雪崩都是在缓存不可用时,大量连接到数据库导致数据库不可用导致的,从本质上来说做好数据库的高可用,比如数据库双活,数据库扩容,数据库主从备份,流量监控,分流限流策略等都可以提高服务可用性,为服务恢复赢得有效时间。
当然另一个要考虑的问题是黑客攻击,因为正常服务请求很难造出DB不可用,如果是黑客的大量请求,那么相应的请求告警策略,流量分流限流策略就是非常必要的网络安全保证方案。