淺談redis的set get[布隆過濾器]

布隆過濾器是什麼git

在作JAVA項目時候用到這個(參考地址),今天我們就講一講github

名字就跟每一個定律同樣,你問爲何叫牛頓定律,由於是牛頓發明或者發現的。redis

他能作什麼?它是將一個二進制向量和函數映射,布隆過濾器能夠用在檢測元素是否存在某個集合或者用於快速檢索中。算法

缺點: 有必定的刪除問題和錯誤識別率數據庫

優勢:查詢時間和空間都遠遠超過普通算法後端

布隆過濾器Bloom Filter 是怎麼實現的數組

添加Item或者元素時,建立一個散列函數和一個KEY造成映射,設置的數據=1,只要檢索時判斷 =1就知道這個數據存不存在,有了此方法,查詢時發現有0的則證實必定不存在,那麼反過來說若是是1證實元素極可能存在,緩存

注意這裏爲何說極可能存在,由於他有必定的識別錯誤,但這個錯誤在實際生產過程當中能夠忽略,畢竟利大於弊麼。服務器

看文字暈暈乎乎,不動就畫圖,來看看應該就會明白許多。maven

image.png

說人話

布隆過濾器到底能幹啥?

特殊的id暫且不提哈,數據庫id基本都是自增的對吧!咱們傳遞id後端去DB查詢,這個很是合理。

可是若是咱們用負數查詢呢?一兩條無所謂,若是成千上萬呢?基本上數據庫都會很大壓力扛不住,服務器配置暫且不說,拖慢系統運行速度甚至宕機都是有可能的,這樣是否是布隆過濾器的有點有展示的淋漓盡致。【狗頭】

這麼吊,也是有代價的,由於它也拿不許,存在必定程度的判斷失誤!

問:爲何會誤判?

答:搜索的key沒在容器中,可是hash後獲得的key都是1 。假如布隆過濾器中有黑名單,那麼直接建立一個白名單就搞定了。

問:爲何不容易刪除?

答:咱們提到正確的數據Key值=1,但不能由於=0就刪掉他,這可能會影響其餘元素的判斷 不過能夠了解下Counting Bloom Filter 「下一篇文章」

說了這麼多咋實現

1:預估數量n以及指望的誤判率FPP

2: hash函數和bit集合的size大小

Bit集合Size大小

函數 哈希選擇,預估值n和bit數組長度m獲取hash函數Key

怎麼用?maven項目中添加

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
 </dependency>

一段我寫的測試代碼

/**
 * 布隆過濾器 - 用於redis緩存穿透 的狀況
public class TestBloomFilterByDZZ {

    private static int total = 19999;
    private static BloomFilter<Integer> bfilter = BloomFilter.create(Funnels.integerFunnel(), total);

  // 初始化數據
    public static void main(String[] args) {
        for (int i = 0; i < total; i++) {
            bfilter.put(i);
        }

        // 是否有匹配不上的
        for (int i = 0; i < total; i++) {
            if (!bfilter.mightContain(i)) {
                System.out.println("有沒關注西北大糉子的 溜了。。。");
            }
        }

        // 再也不內的有多少匹配出來
        int count = 0;
        for (int i = total; i < total + 10000; i++) {
            if (bfilter.mightContain(i)) {
                count++;
            }
        }
        System.out.println("炮灰陪跑:" + count);
    }

}

可適用的業務場景

1:當一個入庫數據量比較大的時候,能夠用做名稱或者惟一件作檢查,存在則跳過不存在則入庫

2:過濾垃圾郵件,這是一段計算你能夠結合本身的業務瞭解下。

平常求關注,在被業務折磨的狀況下還能留下點什麼。

相關文章
相關標籤/搜索