java緩存的實現
您是否在詢問為什麼使用緩存,緩存是用來存儲數據的。
FIFO先入先出,很好理解,就和隊列一樣,先進隊列的先出隊列,LRU 最近最少使用,意思就是最近讀取的數據放在最前面,最早讀取的數據放在最後面,如果這個時候有新的數據進來,那麼最後面存儲的數據淘汰,LFU最不常使用,意思就是對存儲的數據都會有一個計數引用,然後隊列按數據引用次數排序,引用數多的排在最前面,引用數少的排在後面。如果這個時候有新的數據進來,把最後面的數據刪除,把新進數據排在最後面,且引用次數為1。
2. 朋友,請問Java頁面暫存功能怎樣實現的呢求教
Java頁面緩存通常由三種方法:
1、JavaBean緩存從資料庫中讀取的內容,通過getter和setter方法
2、通過利用XML緩存當前數據
3、建立相應的緩存池(沒有具體用過)
3. java緩存技術有哪些
常見的java緩存框架有:
OSCache
OSCache是個一個廣泛採用的高性能的J2EE緩存框架,OSCache能用於任何Java應用程序的普通的緩存解決方案。
OSCache有以下特點:
緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
永久緩存--緩存能隨意的寫入硬碟,因此允許昂貴的創建(expensive-to-create)數據來保持緩存,甚至能讓應用重啟。
支持集群--集群緩存數據能被單個的進行參數配置,不需要修改代碼。
緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)。
官方網站 http://www.opensymphony.com/oscache/
Java Caching System
JSC(Java Caching System)是一個用分布式的緩存系統,是基於伺服器的java應用程序。它是通過提供管理各種動態緩存數據來加速動態web應用。
JCS和其他緩存系統一樣,也是一個用於高速讀取,低速寫入的應用程序。
動態內容和報表系統能夠獲得更好的性能。
如果一個網站,有重復的網站結構,使用間歇性更新方式的資料庫(而不是連續不斷的更新資料庫),被重復搜索出相同結果的,就能夠通過執行緩存方式改進其性能和伸縮性。
官方網站 http://jakarta.apache.org/turbine/jcs/
EHCache
EHCache 是一個純java的在進程中的緩存,它具有以下特性:快速,簡單,為Hibernate2.1充當可插入的緩存,最小的依賴性,全面的文檔和測試。
官方網站 http://ehcache.sourceforge.net/
JCache
JCache是個開源程序,正在努力成為JSR-107開源規范,JSR-107規范已經很多年沒改變了。這個版本仍然是構建在最初的功能定義上。
官方網站 http://jcache.sourceforge.net/
ShiftOne
ShiftOne Java Object Cache是一個執行一系列嚴格的對象緩存策略的Java lib,就像一個輕量級的配置緩存工作狀態的框架。
官方網站 http://jocache.sourceforge.net/
SwarmCache
SwarmCache是一個簡單且有效的分布式緩存,它使用IP multicast與同一個區域網的其他主機進行通訊,是特別為集群和數據驅動web應用程序而設計的。SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應用提供更好的性能支持。
SwarmCache使用JavaGroups來管理從屬關系和分布式緩存的通訊。
官方網站 http://swarmcache.sourceforge.net
TreeCache / JBossCache
JBossCache是一個復制的事務處理緩存,它允許你緩存企業級應用數據來更好的改善性能。緩存數據被自動復制,讓你輕松進行JBoss伺服器之間 的集群工作。JBossCache能夠通過JBoss應用服務或其他J2EE容器來運行一個MBean服務,當然,它也能獨立運行。
JBossCache包括兩個模塊:TreeCache和TreeCacheAOP。
TreeCache --是一個樹形結構復制的事務處理緩存。
TreeCacheAOP --是一個「面向對象」緩存,它使用AOP來動態管理POJO(Plain Old Java Objects)
註:AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程。
官方網站 http://www.jboss.org/procts/jbosscache
WhirlyCache
Whirlycache是一個快速的、可配置的、存在於內存中的對象的緩存。它能夠通過緩存對象來加快網站或應用程序的速度,否則就必須通過查詢資料庫或其他代價較高的處理程序來建立。
4. ehcache java 對象緩存怎麼實現
1.技術背景:
系統緩存是位於應用程序與物理數據源之間,用於臨時存放復制數據的內存區域,目的是為減少應用程序對物理數據源訪問的次數,從而提高應用程序的運行性能。緩存設想內存是有限的,緩存的時效性也是有限的,所以可以設定內存數量的大小可以執行失效演算法,可以在內存滿了的情況下,按照最少訪問等演算法將緩存直接移除或切換到硬碟上。
Ehcache從Hibernate發展而來,逐漸涵蓋了Cache界的全部功能,是目前發展勢頭最好的一個項目,具有快速、簡單、低消耗、擴展性強、支持對象或序列化緩存,支持緩存或元素的失效,提供LRU、LFU和FIFO緩存策略,支持內存緩存和硬碟緩存和分布式緩存機制等特點。其中Cache的存儲方式為內存或磁碟(ps:無須擔心容量問題)
2.EhCahe的類層次介紹:
主要分為三層,最上層是CacheManager,它是操作Ehcache的入口。可以通過CacheManager.getInstance()獲得一個單子的CacheManager,或者通過CacheManager的構造函數創建一個新的CacheManager。每個CacheManger都管理多個Cache。每個Cache都以一種類Hash的方式,關聯多個Element。Element就是我們用於存放緩存內容的地方。
3.環境搭建:
很簡單只需要將ehcache-2.1.0-distribution.tar.gz和ehcache-web-2.0.2-distribution.tar.gz擠壓的jar包放入WEB-INF/lib下。
再創建一個重要的配置文件ehcache.xml,可以從ehcache組件包中拷貝一個,也可以自己建立一個,需要放到classpath下,一般放於/WEB-INF/classed/ehcache.xml;具體的配置文件可以網上搜一下
4.實際運用
一個網站的首頁估計是被訪問次數最多的,我們可以考慮給首頁做一個頁面緩存;
緩存策略:應該是某個固定時間之內不變的,比如說2分鍾更新一次,以應用結構page-filter-action-service--db為例。
位置:頁面緩存做到盡量靠近客戶的地方,就是在page和filter之間,這樣的優點就是第一個用戶請求後,頁面被緩存,第二個用戶在請求,走到filter這個請求就結束了,需要在走到action-service--db,好處當然是伺服器壓力大大降低和客戶端頁面響應速度加快。
首頁頁面緩存存活時間定為2分鍾,也就是參數timeToLiveSeconds(緩存的存活時間)應該設置為120,同時timeToIdleSeconds(多長時間不訪問緩存,就清楚該緩存)最好也設為2分鍾或者小於2分鍾。
接著我們來看一下SimplePageCachingFilter的配置,
<filter>
<filter-name>indexCacheFilterfilter-name>
<filter-class>
net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
<filter-class>
<filter>
<filter-mapping>
<filter-name>indexCacheFilterfilter-name>
<url-pattern>*index.actionurl-pattern>
<filter-mapping>
將上述代碼加入到web.xml,那麼當打開首頁時,你會發現2分鍾才會有一堆sql語句出現在控制台,也可以調整為5分鍾,總之一切盡在掌控之中。
當然,如果你像緩存首頁的部分內容時,你需要使用這個filter,我看一下:
<filter>
<filter-name>indexCacheFilterfilter-name>
<filter-class>
net.sf.ehcache.constructs.web.filter.
<filter-class>
filter>
<filter-mapping>
<filter-name>indexCacheFilterfilter-name>
<url-pattern>*/index_right.jsp<url-pattern>
<filter-mapping>
如此我們將jsp頁面通過jsp:include到其他頁面,這樣就做到了頁面局部緩存的效果,這一點貌似沒有oscache的tag好用。
此外cachefilter中還有一個特性,就是gzip,也就是緩存中的元素是被壓縮過的,如果客戶端瀏覽器支持壓縮的話,filter會直接返回壓縮過的流,這樣節省了帶寬,把解壓的工作交給了客戶端瀏覽即可,當然如果客戶端不支持gzip,那麼filter會把緩存的元素拿出來解壓後在返回給客戶端瀏覽器(大多數爬蟲是不支持gzip的,所以filter也會解壓後在返迴流)。
總之,Ehcache是一個非常輕量級的緩存實現,而且從1.2之後支持了集群,而且是hibernate默認的緩存provider,本文主要介紹Ehcahe對頁面緩存的支持,但是它的功能遠不止如此,要用好緩存,對J2ee中緩存的原理、適用范圍、適用場景等等都需要比較深刻的理解,這樣才能用好用對緩存。
為了大家通過實際例子加深了解與場景運用,在奉獻一個實例:
*在Spring中運用EhCache
適用任意一個現有開源CacheFramework,要求可以Cache系統中service或者DAO層的get/find等方法返回結果,如果數據更新(適用了Create/update/delete),則刷新cache中相應的內容。
根據需求,計劃適用SpringAOP+enCache來實現這個功能,採用ehCache原因之一就是Spring提供了enCache的支持,至於為何僅僅支持ehcache而不支持oscache和jbosscache就無從得知了。
AOP少不了攔截器,先創建一個實現了MethodInterceptor介面的攔截器,用來攔截Service/DAO的方法調用,攔截到方法後,搜索該方法的結果在cache中是否存在,如果存在,返回cache中結果,如果不存在返回資料庫查詢結果,並將結果返回到緩存。
,InitializingBean
{
privatestaticfinalLoglogger=LogFactory.getLog(MethodCacheInterceptor.class);
privateCachecache;
publicvoidsetCache(Cachecache){
this.cache=cache;
}
publicMethodCacheInterceptor(){
super();
}
/**
*攔截Service/DAO的方法,並查找該結果是否存在,如果存在就返回cache中的值,
*否則,返回資料庫查詢結果,並將查詢結果放入cache
*/
publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
StringtargetName=invocation.getThis().getClass().getName();
StringmethodName=invocation.getMethod().getName();
Object[]arguments=invocation.getArguments();
Objectresult;
logger.debug("Findobjectfromcacheis"+cache.getName());
StringcacheKey=getCacheKey(targetName,methodName,arguments);
Elementelement=cache.get(cacheKey);
Page13of26
if(element==null){
logger.debug("Holpmethod,Getmethodresultandcreatecache........!");
result=invocation.proceed();
element=newElement(cacheKey,(Serializable)result);
cache.put(element);
}
returnelement.getValue();
}
/**
*獲得cachekey的方法,cachekey是Cache中一個Element的唯一標識
*cachekey包括包名+類名+方法名,如com.co.cache.service.UserServiceImpl.getAllUser
*/
privateStringgetCacheKey(StringtargetName,StringmethodName,Object[]arguments){
StringBuffersb=newStringBuffer();
sb.append(targetName).append(".").append(methodName);
if((arguments!=null)&&(arguments.length!=0)){
for(inti=0;i<arguments.length;i++){
sb.append(".").append(arguments[i]);
}
}
returnsb.toString();
}
/**
*implementInitializingBean,檢查cache是否為空
*/
publicvoidafterPropertiesSet()throwsException{
Assert.notNull(cache,"Needacache.PleaseusesetCache(Cache)createit.");
}
}
上面的代碼可以看到,在方法invoke中,完成了搜索cache/新建cache的功能
隨後,再建立一個攔截器MethodCacheAfterAdvice,作用是在用戶進行create/update/delete操作時來刷新、remove相關cache內容,這個攔截器需要實現AfterRetruningAdvice介面,將會在所攔截的方法執行後執行在afterReturning(objectarg0,Methodarg1,Object[]arg2,objectarg3)方法中所預定的操作
,InitializingBean
{
privatestaticfinalLoglogger=LogFactory.getLog(MethodCacheAfterAdvice.class);
privateCachecache;
Page15of26
publicvoidsetCache(Cachecache){
this.cache=cache;
}
publicMethodCacheAfterAdvice(){
super();
}
publicvoidafterReturning(Objectarg0,Methodarg1,Object[]arg2,Objectarg3)throws
Throwable{
StringclassName=arg3.getClass().getName();
Listlist=cache.getKeys();
for(inti=0;i<list.size();i++){
StringcacheKey=String.valueOf(list.get(i));
if(cacheKey.startsWith(className)){
cache.remove(cacheKey);
logger.debug("removecache"+cacheKey);
}
}
}
publicvoidafterPropertiesSet()throwsException{
Assert.notNull(cache,"Needacache.PleaseusesetCache(Cache)createit.");
}
}
該方法獲取目標class的全名,如:com.co.cache.test.TestServiceImpl,然後循環cache的keylist,刷新/removecache中所有和該class相關的element。
接著就是配置encache的屬性,如最大緩存數量、cache刷新的時間等等。
<ehcache>
<diskStorepath="c:\myapp\cache"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cachename="DEFAULT_CACHE"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300000"
timeToLiveSeconds="600000"
overflowToDisk="true"
/>
</ehcache>
這里需要注意的是defaultCache定義了一個默認的cache,這個Cache不能刪除,否則會拋出Nodefaultcacheisconfigured異常。另外由於使用攔截器來刷新Cache內容,因此在定義cache生命周期時可以定義較大的數值,timeToIdleSeconds="30000000",timeToLiveSeconds="6000000",好像還不夠大?
然後再將Cache和兩個攔截器配置到Spring的配置文件cache.xml中即可,需要創建兩個「切入點」,分別用於攔截不同方法名的方法。在配置application.xml並且導入cache.xml。這樣一個簡單的Spring+Encache框架就搭建完成。
5. java內存或者是緩存管理怎麼實現
我不太清楚你為什麼用map來存放數據?你用什麼作為key呢?如果是我做的話我會自定義一個對象,裡面大體上有如下屬性:發言人、發言時間、發言內容等。然後用list存放這些對象,list是由順序的。如果長度到達一定值可以把最先放進去的對象清除掉或移動到其他地方。
6. java如何實現線程安全的緩存
簡單來說就是多線程的時候,多線程同時修改同一個類的時候,由於訪問順序隨機導致類功能出錯,至於線程安全類設計方法很多的,Java可以用synchronize標識類,只允許一個線程在同一時間訪問它,選擇線程安全的數據類型例如ArrayList,數組是不安全的,你可以多去網路查!
7. 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,就像一個輕量級的配置緩存工作狀態的框架。
8. java實現緩存技術
如果數據量不大的情況下可以使用單例模式來構建緩存控制器,
session的話用來保存用戶訪問信息把,訪問結束就不保存
後面這種如果表的數據量大了 ,建議使用緩存框架,否則這些信息載入在內存中虛擬機又不回收就很大...
純屬個人看法,其實這種通過測試來判斷在哪種情況下使用哪種技術更加精確
9. java 定時緩存怎麼實現
while(true) {
Map<K, V> dead = null;
Time.sleep(sleepTime);
synchronized(_lock) {
dead = _buckets.removeLast();
_buckets.addFirst(new HashMap<K, V>());
}
}
邏輯思路,將數據存在一個linkList中,如果保存時間為time。線程循環刪掉最後一個元素 removeLast(),同時在頭部添加元素addFirsr();
同理,感覺用隊列 blackQuere更好一些。
10. 哪位了解java數據緩存技術有哪些
一、什麼是緩存
1、Cache是高速緩沖存儲器 一種特殊的存儲器子系統,其中復制了頻繁使用的數據以利於快速訪問
2、凡是位於速度相差較大的兩種硬體/軟體之間的,用於協調兩者數據傳輸速度差異的結構,均可稱之為 Cache
常見的緩存技術有哪些?
一、操作系統緩存
1、文件系統提供的Disk Cache:操作系統會把經常訪問到的文件內容放入到內存當中,由文件系統來管理
2、當應用程序通過文件系統訪問磁碟文件的時候,操作系統從Disk Cache當中讀取文件內容,加速了文件讀取速度
3、Disk Cache由操作系統來自動管理,一般不用人工干預,但應當保證物理內存充足,以便於操作系統可以使用盡量多的內存充當Disk Cache,加速文件讀取速度
4、特殊的應用程序對文件系統Disk Cache有很高的要求,會繞開文件系統Disk Cache,直接訪問磁碟分區,自己實現Disk
5、Cache策略
Oracle的raw device(裸設備) – 直接拋棄文件系統
MySQL的InnoDB: innodb_flush_method = O_DIRECT
二、資料庫緩存
緩存策略:a、Query Cache;b、Data Buffer
三、應用程序緩存
包括對象緩存、查詢緩存、頁面緩存
四、web伺服器端緩存
基於代理伺服器模式的Web伺服器端緩存,如squid/nginx
Web伺服器緩存技術被用來實現CDN(內容分發網路 content delivery network)
被國內主流門戶網站大量採用
不需要編程,但僅限於新聞發布類網站,頁面實時性要求不高
五、基於ajax的瀏覽器緩存
使用AJAX調用的時候,將資料庫在瀏覽器端緩存
只要不離開當前頁面,不刷新當前頁面,就可以直接讀取緩存數據
只適用於使用AJAX技術的頁面