当前位置: 首页 > news >正文

预防缓存击穿-布隆过滤器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

布隆过滤器之防止缓存击穿

为什么使用布隆过滤器

  • 布隆过滤器可以用于检索一个元素是否在一个集合中的重要工具,具有快速,比哈希表更节省空间等优点,而缺点在于有一定的误识别率
  • 布隆过滤器(bloom filter)是Google Guava类库里面的组件
  • 当代换联网环境下使用缓存的公司可说遍地都是大家都知道使用缓存就是为了缓存一些冷数据以减少数据库压力
  • 查询一些缓存不存在的数据 透过缓存直接查询数据库
  • 服务报错

布隆过滤器介绍

  • bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中
  • 初始化时会初始化一个长度为n比特的数组,每个比特位初始化为0(n值个数由误判率决定,误判率越小则n值越大,误判率越大则n值越小)
  • 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
  • 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中(k值个数由误判率决定,误判率越小则k值越大,误判率越大则k值越小)
  • 不需要存储key,节省空间

布隆过滤器代码实现

  • 代码实现
    	package com.f.fmodules.fuser.bloom;
    
    	import com.google.common.base.Charsets;
    	import com.google.common.hash.BloomFilter;
    	import com.google.common.hash.Funnels;
    
    	import java.util.*;
    
    	public class BloomFilterDemo {
    
    		public static void main(String[] args) {
    			final int count = 500000;
    			List<String> stringList = new ArrayList<>(count);
    			Set<String> stringSet = new HashSet<>();
    			//创建布隆过滤器 初始化过滤器数据
    			BloomFilter<String> bloomString = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),count);
    			for (int i =0;i< count;i++){
    				String id = UUID.randomUUID().toString();
    				stringList.add(id);
    				stringSet.add(id);
    				bloomString.put(id);
    			}
    			int wrong = 0;
    			int right = 0;
    			for (int i =0;i< count; i++) {
    				String checkString = i % 100 == 0 ? stringList.get(i) : UUID.randomUUID().toString();
    				//布隆过滤器 进过hash算法和byte数组 校验是否存在于集合中
    				if (bloomString.mightContain(checkString)){
    					//校验是否误判
    					if (stringSet.contains(checkString)){
    						right++;
    					}else{
    						wrong++;
    					}
    				}
    			}
    			System.out.println("50万测试数据-->共抵挡: "+(count - wrong - right)+"次非法入侵"+"    误判"+wrong);
    		}
    	}
    
  • 运行结果
  • 成功访问5000是正确答案 50万对100取模 刚好是5000
    为什么会有14721次误判呢 咱们跟进源码进行深入探索
    深入源码可发现 误判率在百分之三的情况下 有300多万个byte数组 会进行5次hash算法进行判断数据是否存在已知数据中
  • 初始化布隆过滤器时设置误判率为0.01
    	//创建布隆过滤器 初始化过滤器数据
    	BloomFilter<String> bloomString = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),count,0.001);
    
  • debug深入源码

    此时发现误判率设置为百分之一的情况下 byte数组达到七百多万 而需要进行的hash算法次数达到十次
  • 查看运行结果

    结果可看出 误判率为百分之一的情况下 5000次正确访问 只有500多次误判

思考

  • 算法判断key在集合中时,有一定的概率key其实不在集合中
  • 并不是设置的误判率越小越好,误判率越小代表需要进行hash计算次数越多消耗资源越多,应根据实际情况进行决策
  • k值无法删除

总结

  • 个人觉得若使用此过滤器(条件允许的情况下)可专门用一台服务区用来初始化集合里面的值.

转载于:https://my.oschina.net/u/3498817/blog/3038195

相关文章:

  • Windows下PyQt4的安装
  • jsplumb 使用总结
  • PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
  • [mysql]错误解决之Failed to start MySQL Server
  • CSS3 calc的用法详解
  • MySQL主从复制虽好,能完美解决数据库单点问题吗?
  • 声明25个长度的数组,通过键盘录入学生成绩,并把每个元素赋值为学生的分数成绩,输出结束后遍历输出。...
  • 妈妈走开一会儿
  • 需求的重要性续集
  • 《人月神话》2
  • 7年间减少4000万劳动力,中国企业该何去何从?
  • php图片转base64并保存为文本
  • B 站后端源码被恶意“开源” 6 小时,如何保证后台的安全!
  • bitbucket的使用方法
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • Google 是如何开发 Web 框架的
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【React系列】如何构建React应用程序
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • angular2 简述
  • Create React App 使用
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Idea+maven+scala构建包并在spark on yarn 运行
  • isset在php5.6-和php7.0+的一些差异
  • Java程序员幽默爆笑锦集
  • Java到底能干嘛?
  • Just for fun——迅速写完快速排序
  • Making An Indicator With Pure CSS
  • mysql常用命令汇总
  • MySQL几个简单SQL的优化
  • Python socket服务器端、客户端传送信息
  • Python学习笔记 字符串拼接
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 从PHP迁移至Golang - 基础篇
  • 搞机器学习要哪些技能
  • 前端知识点整理(待续)
  • 手写一个CommonJS打包工具(一)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring第一个helloWorld
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​马来语翻译中文去哪比较好?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #DBA杂记1
  • #define,static,const,三种常量的区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (ZT)出版业改革:该死的死,该生的生
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原)本想说脏话,奈何已放下
  • (转载)Google Chrome调试JS
  • .naturalWidth 和naturalHeight属性,