基于若依框架开发,但是新增的时候报错,找了好久的资料也没解决。
找到这个 69行,有空指针异常报错,分析一下
看这里为什么有空指针
缓存穿透是指用户在数据库查询查不到,在缓存中自然也不会有,这样就导致每次用户查询的时候在缓存查不到,在数据库也查不到,相当于进行了两次无用查询。
缓存穿透解决方案:
(1)采用布隆过滤器。将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
布隆过滤器:
布隆过滤器相当于一个不怎么精确的set结构,布隆过滤器有两个基本指令,bf.add添加元素,bg.exits查询元素是否存在。要想一次添加多个元素,用bf.madd指令。
要一次查找是否存在多个元素,用bf.mexits指令。
布隆过滤器的原理如图:
每个布隆过滤器对应到Redis的数据结构里面就是一个大型的位数组和几个不一样的无偏hash函数,所谓无偏就是能把hash值算的比较均匀。
向布隆过滤器中添加key值时,会使用多个hash函数对key值进行hash算法取得一个哈希值,然后对数组长度进行取模运算得到一个下标位置,每个hash函数都会得到一个不同的位置,最后得到多个位置,再把位数组的这几个位置都置为1就完成了add操作。
向布隆过滤器中查询某个key值时,也跟add操作一样,算出来hash的几个位置,看看这几个位置是否都为1,有一个为0就说明布隆过滤器中该值不存在。如果这几个位置都是1,
也不一定说明这个key存在,也有可能是别的key值存在导致。
Redis中使用布隆过滤器:
布隆过滤器可能存在误判的情况,Redis中有两个值可以决定布隆过滤器的准确率。
Redis中有一个命令可以来设置这两个值:
bf.reserve urls 0.01 100
三个参数的含义:
(2)如果一个查询的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。这样下一次访问缓存就有值了,而不会继续访问数据库。