目录

1. Swagger

1.1 介绍

1.2 Swagger 的优势

1.3 简单使用

1.3.1 集成 Swagger 管理 API 文档

1.3.2 在线测试接口

1.4 常用注解

1.5 参考链接

2 布隆过滤器

2.1 背景

2.2 布隆过滤器介绍

2.3 基本思想

2.4 优缺点

2.4.1 优点

2.4.2 缺点

2.5 布隆过滤器的数据结构与原理图解

2.6 如何选择哈希函数个数和布隆过滤器长度

2.7 简单代码示例

2.8 参考链接


1. Swagger

1.1 介绍

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。

目前的项目基本都是前后端分离,后端为前端提供接口的同时,还需同时提供接口的说明文档。但我们的代码总是会根据实际情况来实时更新,这个时候有可能会忘记更新接口的说明文档,造成一些不必要的问题。

API文档变成了前后端开发人员联系的纽带,变得越来越重要,swagger就是一款让你更好的书写API文档的框架。

总结:swagger用于写接口说明文档的。

1.2 Swagger 的优势

(1)支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。

(2)提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。

1.3 简单使用

1.3.1 集成 Swagger 管理 API 文档

(1)项目中集成 Swagger

集成 Swagger 使用封装好了的 Starter 包,代码如下所示。

<!-- Swagger -->
<dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId><version>1.7.1.RELEASE</version>
</dependency>

在启动类中使用 @EnableSwagger2Doc 开启 Swagger,代码如下所示。

@EnableSwagger2Doc
@SpringBootApplication
public class AuthApplication {public static void main(String[] args) {SpringApplication.run(AuthApplication.class, args);}
}

(2)使用 Swagger 生成文档

Swagger 是通过注解的方式来生成对应的 API,在接口上我们需要加上各种注解来描述这个接口。

@ApiOperation(value = "新增用户")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserDto.class) })
@PostMapping("/user")
public UserDto addUser(@RequestBody AddUserParam param) {System.err.println(param.getName());return new UserDto();
}

参数类定义代码如下所示。

@Data
@ApiModel(value = "com.biancheng.auth.param.AddUserParam", description = "新增用户参数")
public class AddUserParam {@ApiModelProperty(value = "ID")private String id;@ApiModelProperty(value = "名称")private String name;@ApiModelProperty(value = "年龄")private int age;}

1.3.2 在线测试接口

接口查看地址可以通过服务地址 /swagger-ui.html 来访问,见下图。

1.4 常用注解

  1. - @Api()用于类:表示标识这个类是swagger的资源
  2. - @ApiOperation()用于方法:表示一个http请求的操作
  3. - @ApiParam()用于方法,参数,字段说明:表示对参数的添加元数据(说明或是否必填等)
  4. - @ApiModel()用于类:表示对类进行说明,用于参数用实体类接收
  5. - @ApiModelProperty()用于方法,字段:表示对model属性的说明或者数据操作更改
  6. - @ApiIgnore()用于类,方法,方法参数:表示这个方法或者类被忽略
  7. - @ApiImplicitParam() 用于方法:表示单独的请求参数
  8. - @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam

1.5 参考链接

Swagger是什么?Swagger怎么用?

超详细!使用swagger自动生成Api文档(swagger-ui)

2 布隆过滤器

2.1 背景

在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断 它是否在已知的字典中);在FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。比如公众电子邮件(email)提供商,有时候需要过滤来自发送垃圾邮件的人的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿个 email 地址,就需要 1.6GB 的内存。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

2.2 布隆过滤器介绍

布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是识别错误(即假反例False negatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)的情形是不会出现的,并且删除困难

布隆过滤器是一种把大数据集换成小数据集以节约下一步处理所需要时间的方法,与传统哈希表方法相比其所需要的空间更少,其另一个特点是可能没有过滤掉所有不符合标准的数据,但不会把符合标准数据错误的过滤掉

布隆过滤器的使用场景比较多,比如防止缓存穿透垃圾邮件的检测等。

2.3 基本思想

如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。

Hash面临的问题就是冲突。假设 Hash 函数是良好的,如果我们的位阵列长度为 m 个点,那么如果我们想将冲突率降低到例如 1%, 这个散列表就只能容纳 m/100 个元素。显然这就不叫空间有效了(Space-efficient)。解决方法也简单,就是使用多个 Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,不过直觉上判断这种事情的概率是比较低的。

2.4 优缺点

2.4.1 优点

  1. 相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。
  2. 另外,Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势
  3. 布隆过滤器可以表示全集,其它任何数据结构都不能。

2.4.2 缺点

  1. 但是布隆过滤器的缺点和优点一样明显。误报率(False Positive)是其中之一。随着存入的元素数量增加,误报率随之增加。
  2. 另外,一般情况下不能从布隆过滤器中删除元素。很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先必须保证删除的元素的确在布隆过滤器里面。这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。

(目前,名为 Counting Bloom filter 的变种可以用来测试元素计数个数是否绝对小于某个阈值,它支持元素删除,但是其也有一定的缺点。可以参考文章 Counting Bloom Filter 的原理和实现 )

2.5 布隆过滤器的数据结构与原理图解

布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:

如果要映射一个值到布隆过滤器中,需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1,例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7,则上图转变为:

现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为:

值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此可以很确定地说 “dianping” 这个值不存在。而当需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后检查发现这三个 bit 位上的值均为 1,那么可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

2.6 如何选择哈希函数个数和布隆过滤器长度

很显然,过小的布隆过滤器很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”,起不到过滤的目的了。布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小

另外,哈希函数的个数也需要权衡,个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低但是如果太少的话,那误报率会变高

2.7 简单代码示例

Google Guava 库已对Bloom Filter 封装好,直接使用即可。下面通过一个小案例来看看 BloomFilter 怎么使用,代码如下所示。

public static void main(String[] args) {// 总数量int total = 1000000;BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total);// 初始化 10000 条数据到过滤器中for (int i = 0; i < total; i++) {bf.put("" + i);}// 判断值是否存在过滤器中int count = 0;for (int i = 0; i < total + 10000; i++) {if (bf.mightContain("" + i)) {count++;}}System.out.println("匹配数量 " + count);
}

通过 BloomFilter.create 创建一个布隆过滤器,初始化 1000000 条数据到过滤器中,然后在初始化数据的基础上加上 10000 条,分别去过滤器中检查是否存在,按照正常的逻辑来说,匹配的数量肯定是 1000000,事实上输出的结果如下:

匹配数量 1000309

匹配出的数量多出来 309 条,正是因为布隆过滤器是存在的错误率。可以调节布隆过滤器的错误率,在 create 的时候可以指定第 3 个参数来指定错误率,具体代码如下所示。

BloomFilter<String> bf =
BloomFilter.create(Funnels.stringFunnel(Charsets. UTF_8), total, 0.0003);

错误率调节是一个 double 类型的参数,默认值是 0.03,值越小错误率越小,同时存储空间会越大,这个可以根据需求去调整。那么错误率是怎么计算的呢,总共是 1010000 条数据去测试是否匹配,默认值是 0.03,那么错误率就是 1010000×(0.03/100)=303,刚刚测试的错误数量是 309,可见处于这个范围内。

那么调整之后的错误率有没有效果呢,重新执行下程序看看结果是否跟预想的一样,如果有效果的话,错误数量应该是 1010000×(0.0003/100)=3.03,可以允许错误数量在 3 到 4 个之间。

结果如下:

匹配数量 1000004

在缓存穿透的应用场景下,利用布隆过滤器可以预先将缓存的数据存储到过滤器中,比如用户 ID。当根据 ID 来查询数据的时候,先从过滤器中判断是否存在,存在的话就继续下面的流程,不存在直接返回空即可,因为认为这是一个非法的请求。

2.8 参考链接

布隆过滤器(Bloom Filter)详解

详解布隆过滤器的原理、使用场景和注意事项

防止缓存穿透方案

Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01相关推荐

  1. HBase的布隆过滤器详解

    HBase的布隆过滤器详解 1.布隆过滤器的简单介绍 2.布隆过滤器的原理分析 2.1 哈希表存在的问题 2.2 布隆过滤器的原理 2.2.1 原理详解 2.2.2 布隆过滤器失误率的调节 2.2.3 ...

  2. [转]布隆过滤器详解

    布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中.在垃圾邮件过滤 ...

  3. 解决Redis缓存穿透之布隆过滤器详解

    文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...

  4. 【redis】布隆过滤器详解

    简介 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),它实际上是一个很长的二进制向量和一系列随机映射函数. 布隆过滤器可以用于检索 ...

  5. Google布隆过滤器与Redis布隆过滤器详解

    一.什么是布隆过滤器? 布隆过滤器可以用来判断一个元素是否在一个集合中.它的优势是只需要占用很小的内存空间以及有着高效的查询效率.对于布隆过滤器而言,它的本质是一个位数组:位数组就是数组的每个元素都只 ...

  6. 传智教育|2022最新版Java学习路线图全集汇总——Java学习到底学什么?一文详解

    2022版Java学习路线图来了! 每一年的Java学习路线图都会根据当前市场趋势做调整,也能更有针对性的对小伙伴的Java学习之旅提供帮助,这次小智给大家带来了2022最新版的Java学习路线图,内 ...

  7. Java学习笔记之Pattern类的用法详解(正则表达式)

    转自:https://www.cnblogs.com/sparkbj/articles/6207103.html EG: //验证邮箱 public static final String REGEX ...

  8. 哈希一刀流——布隆过滤器详解

    目录 传统艺能

  9. android edittext 过滤英文名称,Android 限制edittext 整数和小数位数 过滤器(详解)

    写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码: package allone.verbank.apad.client.component; import android.t ...

最新文章

  1. LeetCode简单题之按既定顺序创建目标数组
  2. 决策树算法(三)——计算香农熵
  3. 请教提高代码编写组织能力代码优化、精明
  4. SYN攻击原理 accpet()函数调用时机
  5. 编写start脚本程序_使用可编写脚本的终结点遍历REST应用程序
  6. 原来Java大数据才是真正的高富帅!
  7. 20行python代码的入门级小游戏--源码:猜大小
  8. 数据库—并发调度的可串行性
  9. Zookeeper四字监控命令使用总结
  10. android 应用程序结构是哪些
  11. iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax屏幕适配
  12. 记第一次自己组装台式机
  13. 面试题:写一个左中右布局占满屏幕,其中左右两块是固定宽度200 , 中间自适应宽,要求先加载中间块,请写出结构及样式:
  14. 跨越OpenGL和D3D的鸿沟
  15. QT菜单栏颜色与背景颜色设置
  16. 浅谈RASP技术攻防之实战
  17. ST-link驱动下载、安装、配置和升级
  18. 手机连接投影机的步骤_投影仪如何投屏手机?手机连接投影仪的步骤
  19. 设计模式 - 模版模式
  20. 苹果笔记本这样处理不易被套路

热门文章

  1. Python使用HappyBase连接Hbase与基本操作
  2. Python PCA降维小例子
  3. Python为数据添加拉普拉斯噪声Laplace noise
  4. 面向java开发者的函数式编程_函数式编程让你忘记设计模式
  5. 琢越网用户使用手册和反馈
  6. ueditor chrome bug
  7. ubutn下安装英伟达显卡驱动
  8. POJ1993+矩阵相乘
  9. 常见的排序算法五——堆排序
  10. 数学连乘和累加运算符号_数学符号归纳