社区
其他技术讨论专区
帖子详情
布隆过滤器是如何解决缓存穿透问题的
weixin_38066328
2019-08-20 01:21:36
请问布隆过滤器(Bloom Filter)是如何解决缓存穿透(cache penetration)问题的?
...全文
244
2
打赏
收藏
布隆过滤器是如何解决缓存穿透问题的
请问布隆过滤器(Bloom Filter)是如何解决缓存穿透(cache penetration)问题的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
weixin_38092066
2019-08-20
打赏
举报
回复
实际项目上没用过,应该是构造一个布隆过滤器放入存储层全部数据,如果缓存找不到过下布隆过滤器,没查到那一定不存在在存储层,查到再去存储层查。但是没办法删除数据这个不好解决,估计使用场景也有限吧。
weixin_38088019
2019-08-20
打赏
举报
回复
缓存穿透应该是 当数据库中没有某个key对应的value时,缓存中也不会有该value的缓存。所以大量的对该value的查询该的请求会绕过缓存,直接查询数据库。 缓存中一般存的是 key+value ,但是布隆过滤器却可以告诉你 key 对应的value在数据库中存不存在,如果不存在就不用查询数据库了。 拿redis为例子: 请注意,用 redis 也可以做到判断 key 对应的value 在数据库中存不在,那就是把数据库里的所有value对应的key都储存在redis 中,而value可以为空,然后判断下key.IsExists()就可以了,但是这无疑会浪费大量空间,因为存储了数据库中所有的key。而且这也不符合缓存的初衷:咱不能暴力的把所有key都存下来,而是查询了啥key,我们缓存啥key。 而布隆过滤器是一种非常高效的数据结构,把所有数据库的value对应的key 存储到布隆过滤器里,几乎不消耗什么空间,而且查询也是相当的快!但是请注意,它只能判断 key 是否存在(而且会有一定的误差)。 所以一个查询先通过布隆顾虑器判断key是否存在(key 对应的value是否存在数据库中),如果不存在直接返回空就好了。 那么布隆过滤器是怎么做到几乎不消耗空间来储存所有的key,并快速判断特定的key是否存在呢? 其实原理很简单,布隆过滤器 只是一个 byte数组,再加上几个映射函数。 每个key 都通过一系列映射函数,得到一系列的的值k,然后在这个byte数组上的把k下标的值变成1。 当要判断key是否存在时,通过映射函数映射得到的一系列k,查看byte数组相应下标k对应的值是否为1,如果有一个不为1,那么一定不存在。如果都是1 ,那么可能存在。为什么可能而不是一定呢?因为这是一个误差问题,有可能别的key把某个k的位置变成了1,key越多时,误差越大。但是放心不会很大的,这是可以控制的,byte数组越长,误差越小。
redis
缓存穿透
穿透
解决
方案-
布隆过滤器
.docx
redis
缓存穿透
穿透
解决
方案-
布隆过滤器
.docx
php + redis
布隆过滤器
.zip
PHP + Redis 实现
布隆过滤器
,当你的项目需要有大并发的时候,比如id是有序的int类型的时候,增加
布隆过滤器
可以防止缓存失效直接查询数据库导致的
缓存穿透
布隆过滤器
2.2.12
缓解 redis
缓存穿透
的攻击
Redis学习笔记.md
主要介绍redis基本语法、配置、整合springboot、持久化、主从复制、缓存雪崩、
缓存穿透
、
布隆过滤器
、redis实现
布隆过滤器
源码redis.zip
Redis实战,用java自带栅栏机制多线程 模拟请求Redis
缓存穿透
,缓存雪崩的场景, 手写
布隆过滤器
,集群
解决
生产
问题
其他技术讨论专区
433
社区成员
791,271
社区内容
发帖
与我相关
我的任务
其他技术讨论专区
其他技术讨论专区
复制链接
扫一扫
分享
社区描述
其他技术讨论专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章