认识缓存穿透、击穿、雪崩并提供解决方案
缓存穿透
查找数据的顺序是:先查找缓存,再查找数据库
当查找一个数据时,缓存没有都会请求数据库,当查找的数据为热点key,高并发时缓存就起不到作用,会压垮数据库,如果黑客利用这个不存在的key进行攻击可能压垮数据库
解决方案:
1.布隆过滤器:将数据库中的数据哈希映射到bitmap(0、1表示存在、不存在),查询时先访问bitmap,查询不存在的数据就会被bitmap拦截,就不用进入数据库查询。注意:使用布隆过滤器也是有哈希冲突的可能
2.返回空值给缓存:当查询不存在数据访问数据库返回值为空,仍然将空值进行缓存(Redis中value为空值会被回收,可以设置empty字符串等),当然插入值时要替代掉空值
3.接口校验:类似权限校验,不符合的数据不让其访问redis 或者db
4.实时监控:发现黑客恶意攻击,配合运维,拉黑其ip(黑名单的设置限制服务)
缓存击穿
缓存中没有数据但数据库里有(例如缓存过期),会进入后端访问数据库并回设到缓存,高并发的请求key,会压垮数据库
解决方案:
1.设置热点key永不过期(即提前对热点数据进行设置)
2.监控数据,适时调整(访问量大的热门数据延长其过期时间)
3.加互斥锁(mutex key)
互斥锁:在缓存失效的时候(判断拿出来的值为空),第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待,再重新去缓存取数据
缓存雪崩
当缓存服务器重启或者缓存短时间内大量失效,高并发时,引起数据库压力过大甚至宕机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库
解决方案:
1.尽量设置缓存失效时间均匀分布,别在短时间内大量缓存过期
2.考虑用加锁队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求数据库(在高并发下线程阻塞,用户体验差)
3.设置缓存标记,即记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际的key
更多消息资讯,请访问昂焱数据。https://www.ayshuju.com/home