濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Redis BloomFilter實(shí)例講解

Redis BloomFilter實(shí)例講解

熱門(mén)標(biāo)簽:日本中國(guó)地圖標(biāo)注 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 山東外呼銷售系統(tǒng)招商 宿遷便宜外呼系統(tǒng)平臺(tái) 十堰營(yíng)銷電銷機(jī)器人哪家便宜 貴州電銷卡外呼系統(tǒng) 魔獸2青云地圖標(biāo)注 鄭州人工智能電銷機(jī)器人系統(tǒng) 超呼電話機(jī)器人

1. 簡(jiǎn)介

布隆過(guò)濾器是防止緩存穿透的方案之一。布隆過(guò)濾器主要是解決大規(guī)模數(shù)據(jù)下不需要精確過(guò)濾的業(yè)務(wù)場(chǎng)景,如檢查垃圾郵件地址,爬蟲(chóng)URL地址去重, 解決緩存穿透問(wèn)題等。

布隆過(guò)濾器:在一個(gè)存在一定數(shù)量的集合中過(guò)濾一個(gè)對(duì)應(yīng)的元素,判斷該元素是否一定不在集合中或者可能在集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難。

2. guava 實(shí)現(xiàn)

google的guava工具類已經(jīng)幫我們?cè)旌昧溯喿樱ㄟ^(guò)實(shí)例來(lái)感受一下。

2.1 導(dǎo)入依賴

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;

/**
 * 布隆過(guò)濾器簡(jiǎn)單實(shí)現(xiàn)
 * @author ludangxin
 * @date 2021/8/16
 */
@Slf4j
public class BloomFilterTest {
   /**
    * 預(yù)計(jì)要插入元素個(gè)數(shù)
    */
   private static final int SIZE = 1000000;
   /**
    * 誤判率
    */
   private static final double FPP = 0.01;
   /**
    * 布隆過(guò)濾器
    */
   private static final BloomFilterInteger> BLOOMFILTER = BloomFilter.create(Funnels.integerFunnel(), SIZE, FPP);

   public static void main(String[] args) {
      //插入數(shù)據(jù)
      for (int i = 0; i  1000000; i++) {
         BLOOMFILTER.put(i);
      }
      int count = 0;
      // 過(guò)濾判斷
      for (int i = 1000000; i  3000000; i++) {
         if (BLOOMFILTER.mightContain(i)) {
            count++;
            log.info(i + "誤判了");
         }
      }
      log.info("總共的誤判數(shù):" + count);
   }
}

2.3 啟動(dòng)測(cè)試

如上代碼,我們?cè)O(shè)置了0.01的誤差,過(guò)濾判斷時(shí)從1000000到3000000,誤判了2 * 20000000 ≈ 20339 符合預(yù)期。

.....
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 - 總共的誤判數(shù):20339

2.4 小節(jié)

guava的工具包雖然好用,但是數(shù)據(jù)集是存儲(chǔ)在jvm中的,分布式環(huán)境下依然沒(méi)法使用。

3. redisson 實(shí)現(xiàn)

3.1 導(dǎo)入依賴

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 布隆過(guò)濾器實(shí)現(xiàn)
 *
 * @author ludangxin
 * @date 2021/8/16
 */
@Slf4j
@RestController
@RequestMapping("bloomFilter")
@RequiredArgsConstructor
public class BloomFilterWithRedisson {
   private final RedissonClient redissonClient;

   /**
    * 預(yù)計(jì)要插入元素個(gè)數(shù)
    */
   private static final long SIZE = 1000000L;
   /**
    * 誤判率
    */
    private static final double FPP = 0.01;

   /**
    * 自定義布隆過(guò)濾器的 key
    */
   private static final String BLOOM_FILTER_KEY = "bloomFilter";

   /**
    * 向布隆過(guò)濾器中添加數(shù)據(jù), 模擬向布隆過(guò)濾器中添加10億個(gè)數(shù)據(jù)
    */
   @GetMapping
   public void filter() {
     // 獲取布隆過(guò)濾器
      RBloomFilterInteger> bloomFilter = redissonClient.getBloomFilter(BLOOM_FILTER_KEY);
      // 初始化,容量為100萬(wàn), 誤判率為0.01
      bloomFilter.tryInit(SIZE, FPP);
      // 模擬向布隆過(guò)濾器中添加100萬(wàn)個(gè)數(shù)據(jù)
      for (int i = 0; i  SIZE; i++) {
          bloomFilter.add(i);
      }
      int count = 0;
      // 過(guò)濾判斷
      for (int i = 1000000; i  3000000; i++) {
         if (bloomFilter.contains(i)) {
            count++;
            log.info(i + "誤判了");
         }
      }
      log.info("size:" + bloomFilter.getSize());
      log.info("總共的誤判數(shù):" + count);
   }
}

3.3 啟動(dòng)測(cè)試

由于機(jī)器性能有限,又是單機(jī)環(huán)境,所以程序沒(méi)有跑完。

但由此也可以看出,基于redis的布隆過(guò)濾器雖然解決了分布式問(wèn)題,但是性能和guava bloomfilter沒(méi)法比。

到此這篇關(guān)于Redis BloomFilter實(shí)例講解的文章就介紹到這了,更多相關(guān)Redis BloomFilter實(shí)例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis使用元素刪除的布隆過(guò)濾器來(lái)解決緩存穿透問(wèn)題
  • 布隆過(guò)濾器(bloom filter)及php和redis實(shí)現(xiàn)布隆過(guò)濾器的方法
  • Redis實(shí)現(xiàn)布隆過(guò)濾器的方法及原理
  • Redis 中的布隆過(guò)濾器的實(shí)現(xiàn)

標(biāo)簽:大慶 果洛 吉安 臺(tái)州 江蘇 楊凌 北京 朝陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis BloomFilter實(shí)例講解》,本文關(guān)鍵詞  Redis,BloomFilter,實(shí)例,講解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis BloomFilter實(shí)例講解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Redis BloomFilter實(shí)例講解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    临漳县| 彩票| 黄梅县| 乌恰县| 甘孜| 封开县| 昌图县| 瓮安县| 巩义市| 凤城市| 洪湖市| 萨嘎县| 乾安县| 平昌县| 临潭县| 长春市| 吴旗县| 宽甸| 麦盖提县| 呼图壁县| 报价| 延边| 绥德县| 紫阳县| 康定县| 乐山市| 舞阳县| 兴和县| 屏东县| 中西区| 长寿区| 农安县| 黄陵县| 宝丰县| 罗田县| 鹿泉市| 临安市| 贵港市| 晴隆县| 贵定县| 渭南市|