1.redis缓存穿透
缓存穿透:当我们查询一个一定不存在的数据的时候,请求不会经过redis,而是直接在数据库中查询,查询不到的数据也不会直接写入缓存,就会导致每次请求都会去查数据库,数据库压力太大而当机。这种情况往往是遭到了别人的攻击
解决方案:
- 缓存空数据:
- 在数据库中查询返回的数据为空,仍把这个空结果进行缓存
- 但是这个方案有弊端:消耗内存,且会出现数据不一致问题,如果后面我们给这个空数据赋了值,会导致重新赋值的结果出不来,依然返回的null
- 添加布隆过滤器
- 当进行查询时会经过布隆过滤器,再到redis,如果布隆过滤器中不存在则拦截直接返回,存在才放给redis/数据库去查询。
- 这里有一个前提,就是在做缓存预热的时候也需要预热布隆过滤器(初始化),在批量从数据库中把添加到缓存的同时, 把这些值通过hash计算之后存储到布隆过滤器的bitmap中
- 布隆过滤器中有一个bitmap的位图,是一个以bit为单位的数组,数组中每个单元只存储二进制数01,布隆过滤器主要的实现就是依赖于这个bitmap,利用这个位图来检索一个元素是否存在于一个集合中。
- 存储数据:会对这个数据进行多次(3次)hash计算,获取hash值,得到在数组中对应的索引位置,再把这些位置的值由0改为1(初始化的时候都为1)。
- 查询数据:使用相同的hash函数进行hash计算获取hash值,判断对应的位置的值是否都为1,如果为1说明值是存在的,有一个不为1说明不存在
- 误判:可能会存在误判 当我们查询的一个空值的时候,如果hash计算出来的结果正好和其他数据的hash结果相同,那么会被误判为该数据存在
- - 通过设置误判率来解决误判问题,设置在5%
- 总结: