亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Redis BloomFilter實(shí)例講解

 更新時(shí)間:2021年09月01日 10:21:45   作者:張鐵牛  
這篇文章主要介紹了Redis BloomFilter實(shí)例。BloomFilter不需要存儲(chǔ)key,節(jié)省空間,在某些對(duì)保密要求非常嚴(yán)格的場(chǎng)合有優(yōu)勢(shì)。想要進(jìn)一步了解BloomFilter運(yùn)用實(shí)例的小伙伴可以了解一下這篇文章

1. 簡(jiǎn)介

布隆過(guò)濾器是防止緩存穿透的方案之一。布隆過(guò)濾器主要是解決大規(guī)模數(shù)據(jù)下不需要精確過(guò)濾的業(yè)務(wù)場(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 BloomFilter<Integer> 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ò)濾器
      RBloomFilter<Integer> 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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis數(shù)據(jù)的兩種持久化方式對(duì)比

    redis數(shù)據(jù)的兩種持久化方式對(duì)比

    Redis是我們開(kāi)發(fā)中常用的數(shù)據(jù)庫(kù),今天和大家分享的就是redis持久化的2種方式:RDB(Redis DataBase)和AOF(Apend Only File),希望對(duì)大家學(xué)習(xí)redis有幫助,一起來(lái)看看吧。
    2017-08-08
  • 詳解redis端口號(hào)

    詳解redis端口號(hào)

    在本篇內(nèi)容中我們給大家整理了關(guān)于redis端口號(hào)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-06-06
  • redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表

    redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表

    這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表,壓縮列表是列表list和hash數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)之一,是redis為了節(jié)約內(nèi)存而開(kāi)發(fā)的,由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • Redis設(shè)置密碼保護(hù)的實(shí)例講解

    Redis設(shè)置密碼保護(hù)的實(shí)例講解

    今天小編就為大家分享一篇Redis設(shè)置密碼保護(hù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 詳解Redis如何保證接口的冪等性

    詳解Redis如何保證接口的冪等性

    如何防止接口中同樣的數(shù)據(jù)提交,以及如何保證消息不被重復(fù)消費(fèi),這些都是shigen在學(xué)習(xí)的過(guò)程中遇到的問(wèn)題,今天,趁著在學(xué)習(xí)redis的間隙,我寫了一篇文章進(jìn)行簡(jiǎn)單的實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11
  • Windows系統(tǒng)安裝redis數(shù)據(jù)庫(kù)

    Windows系統(tǒng)安裝redis數(shù)據(jù)庫(kù)

    這篇文章介紹了Windows系統(tǒng)安裝redis數(shù)據(jù)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Redis數(shù)據(jù)庫(kù)的安裝配置方法

    Redis數(shù)據(jù)庫(kù)的安裝配置方法

    redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。 redis的出現(xiàn),很大程度補(bǔ)償了memcached這類keyvalue存儲(chǔ)的不足,在部 分場(chǎng)合可以對(duì)關(guān)系數(shù)據(jù)庫(kù)起到很好的補(bǔ)充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便
    2014-06-06
  • Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    本文主要介紹了Redis消息隊(duì)列的三種實(shí)現(xiàn)方式,主要包括List實(shí)現(xiàn)消息隊(duì)列,PubSub消息隊(duì)列,Stream消息隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 在Centos?8.0中安裝Redis服務(wù)器的教程詳解

    在Centos?8.0中安裝Redis服務(wù)器的教程詳解

    由于考慮到linux服務(wù)器的性能,所以經(jīng)常需要把一些中間件安裝在linux服務(wù)上,今天通過(guò)本文給大家介紹下在Centos?8.0中安裝Redis服務(wù)器的詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2022-03-03
  • redis客戶端實(shí)現(xiàn)高可用讀寫分離的方式詳解

    redis客戶端實(shí)現(xiàn)高可用讀寫分離的方式詳解

    基于sentienl 獲取和動(dòng)態(tài)感知 master、slaves節(jié)點(diǎn)信息的變化,我們的讀寫分離客戶端就能具備高可用+動(dòng)態(tài)擴(kuò)容感知能力了,接下來(lái)通過(guò)本文給大家分享redis客戶端實(shí)現(xiàn)高可用讀寫分離的方式,感興趣的朋友一起看看吧
    2021-07-07

最新評(píng)論