java緩存系統
❶ java目前比較常用的緩存有哪些 集中式緩存與分布式緩存有何區別 它們應用場景是
java目前常用的緩存:
Generic
JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, etc)
EhCache 2.x
Hazelcast
Infinispan
Couchbase
Redis
Caffeine
Guava (deprecated)
Simple
建議使用spring boot集成方式,可插拔,簡單。
集中式緩存適用場景:
1、伺服器集群部署。
2、數據高一致性(任何數據變化都能及時的被查詢到)
分布式緩存適用場景:
系統需要緩存的數據量大
對數據的可用性較高的情況
需要橫向擴展,從而達到緩存的容量無限的要求
❷ 如何使用bloomfilter構建大型Java緩存系統 bloomfilter
在如今的軟體當中,緩存是解決很多問題的一個關鍵概念。你的應用可能會進行CPU密集型運算。你當然不想讓這些運算一邊又一邊的重復執行,相反,你可以只執行一次, 把這個結果放在內存中作為緩存。有時系統的瓶頸在I/O操作上,比如你不想重復的查詢資料庫,你想把結果緩存起來,只在數據發生變化時才去數據查詢來更新緩存。
與上面的情況類似,有些場合下我們需要進行快速的查找來決定如何處理新來的請求。例如,考慮下面這種情況,你需要確認一個URL是否指向一個惡意網站,這種需求可能會有很多。如果我們把所有惡意網站的URL緩存起來,那麼會佔用很大的空間。或者另一種情況,需要確認用戶輸入的字元串是包含了美國的地名。像「華盛頓的博物館」——在這個字元串中,華盛頓是美國的一個地名。我們應該把美國所有的地名保存在內存中然後再查詢嗎?那樣的話緩存會有多大?是否能在不使用資料庫的前提下來高效地完成?
這就是為什麼我們要跨越基本的數據結構map,在更高級的數據結構像布隆過濾器(bloomfilter)中來尋找答案。你可以把布隆過濾器看做Java中的集合(collection),你可以往它裡面添加元素,查詢某個元素是否存在(就像一個HashSet)。如果布隆過濾器說沒有這個元素,這個結果可能是錯誤的。如果我們在設計布隆過濾器時足夠細心,我們可以把這種出錯的概率控制在可接受范圍內。
❸ java 緩存機制 實現的原理
簡單來說,就是將數據在內存裡面保存著,下次需要,從內存某個位置獲取,而不是從源位置獲取
❹ JAVA中的緩存是怎麼一回事幫忙解釋下。急急急!!!!!!謝謝
許多人認為,「緩存」是內存的一部分
許多技術文章都是這樣教授的
但是還是有很多人不知道緩存在什麼地方,緩存是做什麼用的
其實,緩存是CPU的一部分,它存在於CPU中
CPU存取數據的速度非常的快,一秒鍾能夠存取、處理十億條指令和數據(術語:CPU主頻1G),而內存就慢很多,快的內存能夠達到幾十兆就不錯了,可見兩者的速度差異是多麼的大
緩存是為了解決CPU速度和內存速度的速度差異問題
內存中被CPU訪問最頻繁的數據和指令被復制入CPU中的緩存,這樣CPU就可以不經常到象「蝸牛」一樣慢的內存中去取數據了,CPU只要到緩存中去取就行了,而緩存的速度要比內存快很多
這里要特別指出的是:
1.因為緩存只是內存中少部分數據的復製品,所以CPU到緩存中尋找數據時,也會出現找不到的情況(因為這些數據沒有從內存復制到緩存中去),這時CPU 還是會到內存中去找數據,這樣系統的速度就慢下來了,不過CPU會把這些數據復制到緩存中去,以便下一次不要再到內存中去取。
2.因為隨著時間的變化,被訪問得最頻繁的數據不是一成不變的,也就是說,剛才還不頻繁的數據,此時已經需要被頻繁的訪問,剛才還是最頻繁的數據,現在又不頻繁了,所以說緩存中的數據要經常按照一定的演算法來更換,這樣才能保證緩存中的數據是被訪問最頻繁的
3.關於一級緩存和二級緩存
為了分清這兩個概念,我們先了解一下RAM
ram和ROM相對的,RAM是掉電以後,其中才信息就消失那一種,ROM在掉電以後信息也不會消失那一種
RAM又分兩種,
一種是靜態RAM,SRAM;一種是動態RAM,DRAM。前者的存儲速度要比後者快得多,我們現在使用的內存一般都是動態RAM。
有的菜鳥就說了,為了增加系統的速度,把緩存擴大不就行了嗎,擴大的越大,緩存的數據越多,系統不就越快了嗎
緩存通常都是靜態RAM,速度是非常的快,
但是靜態RAM集成度低(存儲相同的數據,靜態RAM的體積是動態RAM的6倍),
價格高(同容量的靜態RAM是動態RAM的四倍),
由此可見,擴大靜態RAM作為緩存是一個非常愚蠢的行為,
但是為了提高系統的性能和速度,我們必須要擴大緩存,
這樣就有了一個折中的方法,不擴大原來的靜態RAM緩存,而是增加一些高速動態RAM做為緩存,
這些高速動態RAM速度要比常規動態RAM快,但比原來的靜態RAM緩存慢,
我們把原來的靜態ram緩存叫一級緩存,而把後來增加的動態RAM叫二級緩存。
一級緩存和二級緩存中的內容都是內存中訪問頻率高的數據的復製品(映射),它們的存在都是為了減少高速CPU對慢速內存的訪問。
通常CPU找數據或指令的順序是:先到一級緩存中找,找不到再到二級緩存中找,如果還找不到就只有到內存中找了
摘自:http://hi..com/hoare/blog/item/8bc179102acec0f0c2ce7957.html
❺ JAVA幾種緩存技術介紹說明
1、TreeCache / JBossCache
JBossCache是一個復制的事務處理緩存,它允許你緩存企業級應用數據來更好的改善性能。緩存數據被自動復制,讓你輕松進行JBoss伺服器之間 的集群工作。JBossCache能夠通過JBoss應用服務或其他J2EE容器來運行一個MBean服務,當然,它也能獨立運行。
2、WhirlyCache
Whirlycache是一個快速的、可配置的、存在於內存中的對象的緩存。它能夠通過緩存對象來加快網站或應用程序的速度,否則就必須通過查詢資料庫或其他代價較高的處理程序來建立。
3、SwarmCache
SwarmCache是一個簡單且有效的分布式緩存,它使用IP multicast與同一個區域網的其他主機進行通訊,是特別為集群和數據驅動web應用程序而設計的。SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應用提供更好的性能支持。
4、JCache
JCache是個開源程序,正在努力成為JSR-107開源規范,JSR-107規范已經很多年沒改變了。這個版本仍然是構建在最初的功能定義上。
5、ShiftOne
ShiftOne Java Object Cache是一個執行一系列嚴格的對象緩存策略的Java lib,就像一個輕量級的配置緩存工作狀態的框架。
❻ Java的緩存框架有什麼用
(1100)(0)一、什麼是緩存1、Cache是高速緩沖存儲器一種特殊的存儲器子系統,其中復制了頻繁使用的數據以利於快速訪問2、凡是位於速度相差較大的兩種硬體/軟體之間的,用於協調兩者數據傳輸速度差異的結構,均可稱之為Cache二、緩存的分類1、基於web應用的系統架構圖2、在系統架構的不同層級之間,為了加快訪問速度,都可以存在緩存操作系統磁碟緩存->減少磁碟機械操作資料庫緩存->減少文件系統I/O應用程序緩存->減少對資料庫的查詢Web伺服器緩存->減少應用伺服器請求客戶端瀏覽器緩存->減少對網站的訪問三、操作系統緩存1、文件系統提供的DiskCache:操作系統會把經常訪問到的文件內容放入到內存當中,由文件系統來管理2、當應用程序通過文件系統訪問磁碟文件的時候,操作系統從DiskCache當中讀取文件內容,加速了文件讀取速度3、DiskCache由操作系統來自動管理,一般不用人工干預,但應當保證物理內存充足,以便於操作系統可以使用盡量多的內存充當DiskCache,加速文件讀取速度4、特殊的應用程序對文件系統DiskCache有很高的要求,會繞開文件系統DiskCache,直接訪問磁碟分區,自己實現Disk5、Cache策略Oracle的rawdevice(裸設備)–直接拋棄文件系統MySQL的InnoDB:innodb_flush_method=O_DIRECT四、資料庫緩存1、重要性資料庫通常是企業應用系統最核心的部分資料庫保存的數據量通常非常龐大資料庫查詢操作通常很頻繁,有時還很復雜以上原因造成資料庫查詢會引起非常頻繁的磁碟I/O讀取操作,迫使CPU掛起等待,資料庫性能極度低下2、緩存策略a、QueryCache以SQL作為key值緩存查詢結果集一旦查詢涉及的表記錄被修改,緩存就會被自動刪除設置合適的QueryCache會極大提高資料庫性能QueryCache並非越大越好,過大的QqueryCache會浪費內存。MySQL:query_cache_size=128Mb、DataBufferdatabuffer是資料庫數據在內存中的容器databuffer的命中率直接決定了資料庫的性能databuffer越大越好,多多益善MySQL的InnoDBbuffer:innodb_buffer_pool_size=2GMySQL建議bufferpool開大到伺服器物理內存60-80%五、應用程序緩存1、對象緩存由O/RMapping框架例如Hibernate提供,透明性訪問,細顆粒度緩存資料庫查詢結果,無需業務代碼顯式編程,是最省事的緩存策略當軟體結構按照O/RMapping框架的要求進行針對性設計,使用對象緩存將會極大降低Web系統對於資料庫的訪問請求良好的設計資料庫結構和利用對象緩存,能夠提供極高的性能,對象緩存適合OLTP(聯機事務處理)應用2、查詢緩存對資料庫查詢結果集進行緩存,類似資料庫的QueryCache適用於一些耗時,但是時效性要求比較低的場景。查詢緩存和對象緩存適用的場景不一樣,是互為補充的當查詢結果集涉及的表記錄被修改以後,需要注意清理緩存3、頁面緩存a、作用針對頁面的緩存技術不但可以減輕資料庫伺服器壓力,還可以減輕應用伺服器壓力好的頁面緩存可以極大提高頁面渲染速度頁面緩存的難點在於如何清理過期的緩存b、分類I、動態頁面靜態化利用模板技術將訪問過一次的動態頁面生成靜態html,同時修改頁面鏈接,下一次請求直接訪問靜態鏈接頁面動態頁面靜態化技術的廣泛應用於互聯網CMS/新聞類Web應用,但也有BBS應用使用該技術,例如Discuz!無法進行許可權驗證,無法顯示個性化信息可以使用AJAX請求彌補動態頁面靜態化的某些缺點II、Servlet緩存針對URL訪問返回的頁面結果進行緩存,適用於粗粒度的頁面緩存,例如新聞發布可以進行許可權的檢查OScache提供了簡單的Servlet緩存(通過web.xml中的配置)也可以自己編程實現Servlet緩存III、頁面內部緩存針對動態頁面的局部片斷內容進行緩存,適用於一些個性化但不經常更新的頁面(例如博客)OSCache提供了簡單的頁面緩存可以自行擴展JSPTag實現頁面局部緩存六、web伺服器端緩存基於代理伺服器模式的Web伺服器端緩存,如squid/nginxWeb伺服器緩存技術被用來實現CDN(內容分發網路contentdeliverynetwork)被國內主流門戶網站大量採用不需要編程,但僅限於新聞發布類網站,頁面實時性要求不高七、基於ajax的瀏覽器緩存使用AJAX調用的時候,將資料庫在瀏覽器端緩存只要不離開當前頁面,不刷新當前頁面,就可以直接讀取緩存數據只適用於使用AJAX技術的頁面
❼ 如何使用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)