Redis BloomFilter实例讲解_Redis

来源:脚本之家  责任编辑:小易  
目录
1. 简介
2. guava 实现
2.1 导入依赖
2.2 BloomFilterTest
2.3 启动测试
2.4 小节
3. redisson 实现
3.1 导入依赖
3.2 BloomFilterWithRedisson
3.3 启动测试

1. 简介

布隆过滤器是防止缓存穿透的方案之一。布隆过滤器主要是解决大规模数据下不需要精确过滤的业务场景,如检查垃圾邮件地址,爬虫URL地址去重, 解决缓存穿透问题等。

布隆过滤器:在一个存在一定数量的集合中过滤一个对应的元素,判断该元素是否一定不在集合中或者可能在集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2. guava 实现

google的guava工具类已经帮我们造好了轮子,通过实例来感受一下。

2.1 导入依赖

<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>30.1.1-jre</version>
</dependency>

2.2 BloomFilterTest

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;

/**
 * 布隆过滤器简单实现
 * @author ludangxin
 * @date 2021/8/16
 */
@Slf4j
public class BloomFilterTest {
   /**
    * 预计要插入元素个数
    */
   private static final int SIZE = 1000000;
   /**
    * 误判率
    */
   private static final double FPP = 0.01;
   /**
    * 布隆过滤器
    */
   private static final BloomFilter<Integer> BLOOMFILTER = BloomFilter.create(Funnels.integerFunnel(), SIZE, FPP);

   public static void main(String[] args) {
      //插入数据
      for (int i = 0; i < 1000000; i++) {
         BLOOMFILTER.put(i);
      }
      int count = 0;
      // 过滤判断
      for (int i = 1000000; i < 3000000; i++) {
         if (BLOOMFILTER.mightContain(i)) {
            count++;
            log.info(i + "误判了");
         }
      }
      log.info("总共的误判数:" + count);
   }
}

2.3 启动测试

如上代码,我们设置了0.01的误差,过滤判断时从1000000到3000000,误判了2 * 20000000 ≈ 20339 符合预期。

.....
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999004误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999045误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999219误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999699误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999753误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999838误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999923误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 2999928误判了
21:40:21.529 [main] INFO com.ldx.redisson.controller.BloomFilterTest - 总共的误判数:20339

2.4 小节

guava的工具包虽然好用,但是数据集是存储在jvm中的,分布式环境下依然没法使用。

3. redisson 实现

3.1 导入依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-spring-boot-starter</artifactId>
   <version>3.16.1</version>
</dependency>

3.2 BloomFilterWithRedisson

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * redisson 布隆过滤器实现
 *
 * @author ludangxin
 * @date 2021/8/16
 */
@Slf4j
@RestController
@RequestMapping("bloomFilter")
@RequiredArgsConstructor
public class BloomFilterWithRedisson {
   private final RedissonClient redissonClient;

   /**
    * 预计要插入元素个数
    */
   private static final long SIZE = 1000000L;
   /**
    * 误判率
    */
    private static final double FPP = 0.01;

   /**
    * 自定义布隆过滤器的 key
    */
   private static final String BLOOM_FILTER_KEY = "bloomFilter";

   /**
    * 向布隆过滤器中添加数据, 模拟向布隆过滤器中添加10亿个数据
    */
   @GetMapping
   public void filter() {
     // 获取布隆过滤器
      RBloomFilter<Integer> bloomFilter = redissonClient.getBloomFilter(BLOOM_FILTER_KEY);
      // 初始化,容量为100万, 误判率为0.01
      bloomFilter.tryInit(SIZE, FPP);
      // 模拟向布隆过滤器中添加100万个数据
      for (int i = 0; i < SIZE; i++) {
          bloomFilter.add(i);
      }
      int count = 0;
      // 过滤判断
      for (int i = 1000000; i < 3000000; i++) {
         if (bloomFilter.contains(i)) {
            count++;
            log.info(i + "误判了");
         }
      }
      log.info("size:" + bloomFilter.getSize());
      log.info("总共的误判数:" + count);
   }
}

3.3 启动测试

由于机器性能有限,又是单机环境,所以程序没有跑完。

但由此也可以看出,基于redis的布隆过滤器虽然解决了分布式问题,但是性能和guava bloomfilter没法比。

到此这篇关于Redis BloomFilter实例讲解的文章就介绍到这了,更多相关Redis BloomFilter实例内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:Redis使用元素删除的布隆过滤器来解决缓存穿透问题布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法Redis实现布隆过滤器的方法及原理Redis 中的布隆过滤器的实现

  • 本文相关:
  • 通过redis的脚本lua如何实现抢红包功能
  • 5分钟搭建redis集群(redis5.0.5)
  • 简介redis中的showlog功能
  • redis cluster 集群搭建你会吗
  • 详谈redis优化配置和redis.conf说明(推荐)
  • redis集群增加节点与删除节点的方法详解
  • redis教程(十四):内存优化介绍
  • 比较几种redis集群方案
  • centos系统中redis数据库的安装配置指南
  • redis sentinel服务配置流程(详解)
  • Sunshine Bloom 是什么意思
  • blossom与bloom的区别
  • 新游戏画面设置里的bloom和hdr到底是什么效果,谁能具体解释...
  • HDR和Bloom两种高光渲染的差别?
  • summur days in bloom中英歌词 maximilian hecker的歌
  • BLOOM化妆品的功效如何?
  • Summer Days In Bloom中文歌词
  • Summer Days In Bloom歌词译成中文
  • bloom是什么意思?
  • 英文歌曲达人求歌名 so bloom bloom and share your sweet per...
  • 真三国无双5 bloom泛光效果
  • flower与 bloom当“开花”讲时,用法上有何区别?
  • Bloom Point这个品牌的英文名事什么含义啊?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页redisredis使用元素删除的布隆过滤器来解决缓存穿透问题布隆过滤器(bloom filter)及php和redis实现布隆过滤器的方法redis实现布隆过滤器的方法及原理redis 中的布隆过滤器的实现通过redis的脚本lua如何实现抢红包功能5分钟搭建redis集群(redis5.0.5)简介redis中的showlog功能redis cluster 集群搭建你会吗详谈redis优化配置和redis.conf说明(推荐)redis集群增加节点与删除节点的方法详解redis教程(十四):内存优化介绍比较几种redis集群方案centos系统中redis数据库的安装配置指南redis sentinel服务配置流程(详解)超强、超详细redis数据库入门教程redis常用命令、常见错误、配置技redis中5种数据结构的使用场景介redis操作命令总结64位windows下安装redis教程redis中使用redis-dump导出、导入redis 密码设置和查看密码的方法redis中统计各种数据大小的方法redis常用命令小结让redis在你的系统中发挥更大作用redis禁用命令、危险命令及规避方法redis的主从配置方法详解redis基本类型和使用方法详解redis 实现同步锁案例redis简单介绍及安装使用小结在cenos系统下安装和配置redis数据库的教通过redis的脚本lua如何实现抢红包功能redis基本安装判断、启动使用方法示例windows操作系统下redis服务安装图文教程浅谈redis分布式锁的正确实现方式
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved