<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Redis實戰-BloomFilter

      1. 簡介

      布隆過濾器是防止緩存穿透的方案之一。布隆過濾器主要是解決大規模數據下不需要精確過濾的業務場景,如檢查垃圾郵件地址,爬蟲URL地址去重, 解決緩存穿透問題等。

      布隆過濾器:在一個存在一定數量的集合中過濾一個對應的元素,判斷該元素是否一定不在集合中或者可能在集合中。它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難

      想詳細了解的,可以查看我的另一篇博客Redis-緩存穿透/擊穿/雪崩

      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沒法比。

      posted @ 2021-08-16 22:21  張鐵牛  閱讀(870)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品亚洲国产成人av在线| 伊人春色激情综合激情网| 亚洲一区二区av高清| 免费无码又爽又刺激网站| 极品尤物一区二区三区 | 9l精品人妻中文字幕色| 国产精品爽爽久久久久久竹菊| 亚洲精品一区二区三区综合 | 亚洲 国产 制服 丝袜 一区| 婷婷国产成人精品视频| 秋霞人妻无码中文字幕| 国产一区二区三区高清视频| 亚洲人成电影在线天堂色| 亚洲av男人电影天堂热app| 亚洲精品一区二区在线播 | 精精国产xxx在线观看| 99久久精品费精品国产一区二 | 若尔盖县| 亚洲国产片一区二区三区| 91福利视频一区二区| 国产精品99精品久久免费| 亚洲精品成人久久av| 国产99精品成人午夜在线| 亚洲国产美女精品久久久| 最新午夜男女福利片视频| 亚洲熟女乱色综合亚洲图片| 国产成人精品免费视频app软件| 国产睡熟迷奷系列网站| 久久亚洲精精品中文字幕| 色一情一乱一伦麻豆| 18成人片黄网站www| 国产成人黄色自拍小视频| 亚洲人成色99999在线观看| www射我里面在线观看| 三上悠亚精品一区二区久久| 精品国产精品国产偷麻豆| 亚洲av无码成人影院一区| 人妻精品动漫H无码中字| 亚洲人成线无码7777| 亚洲色帝国综合婷婷久久| 亚洲日韩av无码|