怎么解决“穿透”问题?
怎么解决“穿透”问题?
提示
题眼: 空队列和布隆过滤器
**缓存穿透:**是指查询一个一定不存在的数据,由于缓存是不命中时被动写,并且处于容错考虑,如果从 DB 查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,失去了缓存的意义。
解决方案:
- 缓存空对象:当从 DB 查询数据为空,我们仍然将这个空结果进行缓存,具体的值需要使用特殊的标识,能和真正缓存的数据区分开。另外,需要设置较短的过期时间,一般建议不要超过 5 分钟。
- BloomFilter 布隆过滤器:在缓存服务的基础上,构建 BloomFilter 数据结构,在 BloomFilter 中存储对应的 KEY 是否存在,如果存在,说明该 KEY 对应的值不为空。
重要
参考答案:
缓存穿透,其实就是用户传了一个不存在的数据过来,因为数据库里不存在这个数据,因此缓存也不会保存,因此导致每一次请求都会走一次数据库。然后,解决这个问题的话,主要看这个不存在数据的类型。如果说,用户是恶意的传了一些数据,比如ID是个负数之类的情况,那么就需要增加参数校验,把不符合要求的参数都拒掉。如果是一个合规的参数,然后它确实不存在,那么就可以设置一个空队列,把空参数存起来,如果参数再这个队列里,就直接返回为空就行了。
如果数据量比较大的话,可以换成布隆过滤器,他的效率会更高一些。布隆过滤器的话,它主要是用多个哈希算法,利用哈希碰撞来坚持数据是否存在。它底层会使用bitmap来存数据,开销小,性能好。
相关信息
**引申:**什么是布谷鸟过滤器?
