在redis中我們可以使用布隆過濾器(BloomFilter)來解決緩存穿透的問題, 具體流程就是, 在更新緩存時, 我們會將緩存數據的key添加到布隆過濾器中, 然後在查詢緩存之前, 我們先判斷key在布隆過濾器中是否存在, 存在纔去查詢緩存, 不存在則直接返回空.
布隆過濾器(BloomFilter) 是一種插入和查詢性能非常高的數據結構, 功能有點類似於HashMap, 但相對於HashMap來說, 它的性能更高, 佔用的空間更少.
布隆過濾器的原理
布隆過濾器由一個長度爲n的bit數組和k個哈希函數組成. bit數組的每個元素都只佔用1bit, 值只能是0或1.
一個元素添加到布隆過濾器的過程如下:
- 使用k個哈希函數對元素值進行hash, 然後再對n求餘, 得到k個哈希值.
- 以哈希值作爲下標, 將bit數組中對應的值置爲1.
判斷一個元素在布隆過濾器中是否存在的過程如下:
- 使用k個哈希函數對元素值進行hash, 然後再對n求餘, 得到k個哈希值.
- 以哈希值作爲下標, 判斷bit數組中對應的值是否爲1.
- 如果都爲1, 那這個元素可能存在, 如果有一個不爲1, 那這個元素一定不存在.
從上文可以知道布隆過濾器的性能與n和k的值有關, n值越大, 布隆過濾器的錯誤率就越低, k值越大, 保證準確率的元素個數就越少(比如保證100個元素的準確率很高, 超過100個後準確率就明顯下降).
布隆過濾器安裝
布隆過濾器是作爲redis的一個插件安裝的.
(1) github地址
https://github.com/RedisBloom/RedisBloom
(2) 下載包
wget https://github.com/RedisBloom/RedisBloom/archive/v2.0.2.tar.gz
(3) 解壓包
tar -zxvf v2.0.2.tar.gz -C /usr/local/apps/bloomfilter/
(4) 進入解壓後的包中, 進行編譯
cd /usr/local/apps/bloomfilter/RedisBloom-2.0.2
make
(5) 編譯後會生成一個redisbloom.so文件, 配置到redis.conf中
loadmodule /usr/local/apps/bloomfilter/RedisBloom-2.0.2/redisbloom.so
(6) 啓動redis
redis-server /usr/local/redis.conf
(7) 進入redis客戶端
redis-cli
(8) 測試bloomfilter
newFilter爲過濾器的名稱, foo爲key.
(9) 布隆過濾器配置
bf.reserve 過濾器名稱 error_rate initial_size
- error_rate
布隆過濾器的錯誤率, 這個值越低位數組的容量就越大. - initial_size
布隆過濾器可以保證準確率的元素個數, 當實際存儲的元素個數超過這個值之後, 過濾器的準確率會下降