當前位置:首頁 » 凈水方式 » guava過濾器

guava過濾器

發布時間: 2021-04-15 08:47:03

『壹』 如何使用bloomfilter構建大型java緩存系統

在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果我們把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。我們應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼我們要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,這個結果可能是錯誤的。如果我們在設計布隆過濾器時足夠細心,我們可以把這種出錯的概率控制在可接受范圍內。
解釋
布隆過濾器被設計為一個具有N的元素的位數組A(bit array),初始時所有的位都置為0.
添加元素
要添加一個元素,我們需要提供k個哈希函數。每個函數都能返回一個值,這個值必須能夠作為位數組的索引(可以通過對數組長度進行取模得到)。然後,我們把位數組在這個索引處的值設為1。例如,第一個哈希函數作用於元素I上,返回x。類似的,第二個第三個哈希函數返回y與z,那麼:
A[x]=A[y]=A[z] = 1

查找元素
查找的過程與上面的過程類似,元素將會被會被不同的哈希函數處理三次,每個哈希函數都返回一個作為位數組索引值的整數,然後我們檢測位數組在x、y與z處的值是否為1。如果有一處不為1,那麼就說明這個元素沒有被添加到這個布隆過濾器中。如果都為1,就說明這個元素在布隆過濾器裡面。當然,會有一定誤判的概率。
演算法優化
通過上面的解釋我們可以知道,如果想設計出一個好的布隆過濾器,我們必須遵循以下准則:
好的哈希函數能夠盡可能的返回寬范圍的哈希值。
位數組的大小(用m表示)非常重要:如果太小,那麼所有的位很快就都會被賦值為1,這樣就增加了誤判的幾率。
哈希函數的個數(用k表示)對索引值的均勻分配也很重要。
計算m的公式如下:
m = - nlog p / (log2)^2;

這里p為可接受的誤判率。
計算k的公式如下:
k = m/n log(2) ;

這里k=哈希函數個數,m=位數組個數,n=待檢測元素的個數(後面會用到這幾個字母)。
哈希演算法
哈希演算法是影響布隆過濾器性能的地方。我們需要選擇一個效率高但不耗時的哈希函數,在論文《更少的哈希函數,相同的性能指標:構造一個更好的布隆過濾器》中,討論了如何選用2個哈希函數來模擬k個哈希函數。首先,我們需要計算兩個哈希函數h1(x)與h2(x)。然後,我們可以用這兩個哈希函數來模仿產生k個哈希函數的效果:
gi(x) = h1(x) + ih2(x);

這里i的取值范圍是1到k的整數。
Google guava類庫使用這個技巧實現了一個布隆過濾器,哈希演算法的主要邏輯如下:
long hash64 = …; //calculate a 64 bit hash function
//split it in two halves of 32 bit hash values
int hash1 = (int) hash64;
int hash2 = (int) (hash64 >>> 32);
//Generate k different hash functions with a simple loop
for (int i = 1; i <= numHashFunctions; i++) {
int nextHash = hash1 + i * hash2;
}

應用
從數學公式中,我們可以很明顯的知道使用布隆過濾器來解決問題。但是,我們需要很好地理解布隆過濾器所能解決問題的領域。像我們可以使用布隆過濾器來存放美國的所有城市,因為城市的數量是可以大概確定的,所以我們可以確定n(待檢測元素的個數)的值。根據需求來修改p(誤判概率)的值,在這種情況下,我們能夠設計出一個查詢耗時少,內存使用率高的緩存機制。
實現
Google Guava類庫有一個實現,查看這個類的構造函數,在這裡面需要設置待檢測元素的個數與誤判率。
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

//Create Bloomfilter
int expectedInsertions = ….;
double fpp = 0.03; // desired false positive probability
BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.forName("UTF-8")), expectedInsertions,fpp)

『貳』 請按分類要求寫英語單詞

公共場所:park, hospital, museum, market, restaurant
各種房間:living room, kitchen, bathroom,study
身體部位:elbow, knee, leg, arm, stomach
性格印象:optimistic,pessimistic, careful, fathful,energetic,responsible, realistic, logical
日常用品:soap, towel, toothbrush, toothpaste, fork, chopstick,
常見疾病:fever, ulcer, headache, indigestion, flu, stomachache
形狀尺碼:round, oval-shaped, square, triangle,
顏色:red, orange, yellow, green, blue, violet, purple, brown, balck, white, gray, pink,
月份:January, February, March, April, May, June, July, August, September, October, November, December,
方向:left, tight,
位置:front, back, above, below,
天氣:sunny, cloudy, snowy, rainy, foggy, typhooon, tsunami,tornado
水果:guave, watermelon, pear, banana,tomato, mango, kiwi, melon, strawberry, peach, grape, lemon, pineapple, apple, passion fruit
蔬菜:muchroom, asparagus, celery, chestnut, cucumber, eggplant, ginger, onion, corn, pea, pepper,
食物:staak, sandwich, soup, pizza, pasta, cake, hamburger, ham, bread,
飲料:soda, juice, beer, white wine, red wine, milk, tea, soy milk,
動物:dog, cat, goldfish, bear, deer, camel, dolphin, lion, monkey, panda,tiger, sheep, turtle, fox, penguin, rabbit,

『叄』 求 西餐各種醬料和餐具的英文表達,要全面,謝啦

All kinds of sauces and tableware for Western food

詞彙詳解:

kind

一、讀音

英 [kaɪnd] 美 [kaɪnd]

二、釋義

n、同類的人(或事物);種類。

adj、體貼的;慈祥的;寬容的;客氣請求或命令。

三、語法

a kind of:(informal) (表示不確切)某種,幾分,隱約。

(3)guava過濾器擴展閱讀:

kind近義詞:class

詞彙詳解:

一、讀音

英 [klɑːs] 美 [klæs]

二、釋義

n、班;班級;課;上課;(某科目的)系列課程。

v、把…歸入某等級;把…看作。

adj、很好的;優秀的;出色的。

三、語法

the chattering classes:(BrE) 喜歡(對政治或社會問題)發表意見的人。

『肆』 一個合格的Java開發工程師應該具備哪些技能

.CoreJava,就是Java基礎、JDK的類庫,很多童鞋都會說,JDK我懂,但是懂還不足夠,知其然還要知其所以然,JDK的源代碼寫的非常好,要經常查看,對使用頻繁的類,比如String,集合類(List,Map,Set)等數據結構要知道它們的實現,不同的集合類有什麼區別,然後才能知道在一個具體的場合下使用哪個集合類更適合、更高效,這些內容直接看源代碼就OK了2.多線程並發編程,現在並發幾乎是寫服務端程序必須的技術,那對Java中的多線程就要有足夠的熟悉,包括對象鎖機制、synchronized關鍵字,concurrent包都要非常熟悉,這部分推薦你看看《Java並發編程實踐》這本書,講解的很詳細3.I/O,Socket編程,首先要熟悉Java中Socket編程,以及I/O包,再深入下去就是JavaNIO,再深入下去是操作系統底層的Socket實現,了解Windows和Linux中是怎麼實現socket的4.JVM的一些知識,不需要熟悉,但是需要了解,這是Java的本質,可以說是Java的母體,了解之後眼界會更寬闊,比如Java內存模型(會對理解Java鎖、多線程有幫助)、位元組碼、JVM的模型、各種垃圾收集器以及選擇、JVM的執行參數(優化JVM)等等,這些知識在《深入Java虛擬機》這本書中都有詳盡的解釋,或者去oracle網站上查看具體版本的JVM規范.5.一些常用的設計模式,比如單例、模板方法、代理、適配器等等,以及在CoreJava和一些Java框架里的具體場景的實現,這個可能需要慢慢積累,先了解有哪些使用場景,見得多了,自己就自然而然會去用。6.常用資料庫(Oracle、MySQL等)、SQL語句以及一般的優化7.JavaWeb開發的框架,比如Spring、iBatis等框架,同樣他們的原理才是最重要的,至少要知道他們的大致原理。8.其他一些有名的用的比較多的開源框架和包,Netty網路框架,Apachecommon的N多包,Google的Guava等等,也可以經常去Github上找一些代碼看看

『伍』 如何使用bloomfilter構建大型Java緩存系統

在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果我們把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。我們應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼我們要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,那麼可以肯定不含有這個元素,但是如果布隆過濾器說有某個元素,那麼這個結果可能是錯誤的。如果我們在設計布隆過濾器時足夠細心,我們可以把這種出錯的概率控制在可接受范圍內。
解釋

布隆過濾器被設計為一個具有N的元素的位數組A(bit array),初始時所有的位都置為0.
添加元素
要添加一個元素,我們需要提供k個哈希函數。每個函數都能返回一個值,這個值必須能夠作為位數組的索引(可以通過對數組長度進行取模得到)。然後,我們把位數組在這個索引處的值設為1。例如,第一個哈希函數作用於元素I上,返回x。類似的,第二個第三個哈希函數返回y與z,那麼:
A[x]=A[y]=A[z] = 1

查找元素
查找的過程與上面的過程類似,元素將會被會被不同的哈希函數處理三次,每個哈希函數都返回一個作為位數組索引值的整數,然後我們檢測位數組在x、y與z處的值是否為1。如果有一處不為1,那麼就說明這個元素沒有被添加到這個布隆過濾器中。如果都為1,就說明這個元素在布隆過濾器裡面。當然,會有一定誤判的概率。
演算法優化
通過上面的解釋我們可以知道,如果想設計出一個好的布隆過濾器,我們必須遵循以下准則:
好的哈希函數能夠盡可能的返回寬范圍的哈希值。
位數組的大小(用m表示)非常重要:如果太小,那麼所有的位很快就都會被賦值為1,這樣就增加了誤判的幾率。
哈希函數的個數(用k表示)對索引值的均勻分配也很重要。
計算m的公式如下:
m = - nlog p / (log2)^2;

這里p為可接受的誤判率。
計算k的公式如下:
k = m/n log(2) ;

這里k=哈希函數個數,m=位數組個數,n=待檢測元素的個數(後面會用到這幾個字母)。
哈希演算法
哈希演算法是影響布隆過濾器性能的地方。我們需要選擇一個效率高但不耗時的哈希函數,在論文《更少的哈希函數,相同的性能指標:構造一個更好的布隆過濾器》中,討論了如何選用2個哈希函數來模擬k個哈希函數。首先,我們需要計算兩個哈希函數h1(x)與h2(x)。然後,我們可以用這兩個哈希函數來模仿產生k個哈希函數的效果:
gi(x) = h1(x) + ih2(x);

這里i的取值范圍是1到k的整數。
Google guava類庫使用這個技巧實現了一個布隆過濾器,哈希演算法的主要邏輯如下:

long hash64 = …; //calculate a 64 bit hash function
//split it in two halves of 32 bit hash values
int hash1 = (int) hash64;
int hash2 = (int) (hash64 >>> 32);
//Generate k different hash functions with a simple loop
for (int i = 1; i <= numHashFunctions; i++) {
int nextHash = hash1 + i * hash2;
}

應用
從數學公式中,我們可以很明顯的知道使用布隆過濾器來解決問題。但是,我們需要很好地理解布隆過濾器所能解決問題的領域。像我們可以使用布隆過濾器來存放美國的所有城市,因為城市的數量是可以大概確定的,所以我們可以確定n(待檢測元素的個數)的值。根據需求來修改p(誤判概率)的值,在這種情況下,我們能夠設計出一個查詢耗時少,內存使用率高的緩存機制。
實現
Google Guava類庫有一個實現,查看這個類的構造函數,在這裡面需要設置待檢測元素的個數與誤判率。
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

//Create Bloomfilter
int expectedInsertions = ….;
double fpp = 0.03; // desired false positive probability
BloomFilter<CharSequence> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charse

『陸』 如何使用bloomfilter構建大型Java緩存系統

在如抄今的軟體當中,緩存襲是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查...

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239