緩存研究

參考文章:

http://www.doc88.com/p-70821145680.html

http://www.doc88.com/p-18360796408.html

http://www.doc88.com/p-39322208084.html

http://www.doc88.com/p-04069488148.html

http://topmanopensource.iteye.com/blog/450059

基於B/S結構中的緩存方式,可以在不同的層次上進行。筆者比較粗略地從以下幾方面就行分析:

       1)瀏覽器緩存

       2)單臺服務器緩存(hibernateehcache等)

       3)分佈式系統中的緩存(memcachexmemcached

1 瀏覽器緩存

       本博前面一段時間在《Web前端優化》系列中分析了瀏覽器的工作行爲,其中包括了一些瀏覽器緩存的因素。便於大家查看,現將文檔列於下:

       WEB前端優化之內容篇

       Web 前端優化之CSS

       Web 前端優化之 JavaScript

Web前端優化之Server

Web前端優化之圖象

Web前端優化之Cookie

其中較多的參考了《高性能網站建設指南》一書.

另外推薦大家看一篇博文:《J2EEweb開發中的緩存問題的研究》http://www.diybl.com/course/3_program/java/javashl/20081130/152856.html

 

2單臺服務器緩存

       單臺服務器的緩存機制現在有很多,主要有兩種方式:一是採用自編程序實現、二是用現在開源的框架。具體的緩存機制按物理載體又可以分爲內存級別的緩存和磁盤級別的緩存。按併發策略又可以分爲:事務型(Transactional)策略、讀寫型(read-write)策略、非嚴格讀寫型(nonstrict-read-write)策略和只讀型策略(read-only)。各種策略的詳情這裏也不多說了,感興趣的可以再在網上找一下相關資料。下面分析一下這一級別常用的一些緩存機制。

2.1 hibernate+ehcache

Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載。

Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。

一級緩存

當應用程序調用Sessionsave()update() savaeOrUpdate()get()load(),以及調用查詢接口的list()iterate()filter()方法時,如果在 Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。

Session爲應用程序提供了兩個管理緩存的方法:

evict(Object obj):從緩存中清除參數指定的持久化對象。

clear():清空緩存中所有持久化對象。

 

二級緩存

Hibernate的二級緩存策略的一般過程:

1) 條件查詢的時候,總是發出一條select * from table_name where . (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。

2) 把獲得的所有數據對象根據ID放入到第二級緩存中。

3) Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。

4) 刪除、更新、增加數據的時候,同時更新緩存。

Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。爲此,Hibernate提供了針對條件查詢的Query Cache

      

       至於詳細的配置方式,大家可以上網去找吧。

 

2.2 自寫原理

       自己寫cache無非也是把數據存於內存或者磁盤的某個地方,但是自己寫需要考慮到很多方面,如緩存更新策略、緩存訪問策略等等,也都不是非常容易的。這裏主要是利用Spring的相關機制實現緩存。

       原理如下:

1、 在開源工具如ehcache的基礎上編寫緩存工具類,實現緩存需要的基本操作

2、 然後實現函數的AOP攔截類,用來在函數執行前返回緩存內容

3、 配置SpringAOP及其他的一些配置。

 

詳細見《memcached的使用(一)http://marc.iteye.com/blog/28700

 

3分佈式系統中的緩存

       許多Web應用都將數據保存到RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加重、數據庫響應惡化、網站顯示延遲等重大影響。

這時就該memcached大顯身手了。memcached是高性能的分佈式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。、

目前,Java領域出現了xmemcached,它是基於java nio實現的memcached客戶端API

實際上是基於我實現的一個簡單nio框架 http://code.google.com/p/yanf4j/的基礎上實現的(目前是基於yanf4j 0.52),核心代碼不超過1000行,序列化機制直接挪用spymemcachedTranscoder

性能方面,在讀寫簡單類型上比之spymemcached還是有差距,在讀寫比較大的對象(如集合)有效率優勢。

 

一直在關注javaeye,但長期在潛水。javaeye改版後功能強多了,而且最近工作也變動了,接觸了一些新東西,以後還是堅持在這裏記錄些東西吧,也非常看好javaeye的發展。
這些天在設計SNA的架構,接觸了一些遠程緩存、集羣、session複製等的東西,以前做企業應用的時候感覺作用不大,現在設計面對internet的系統架構時就非常有用了,而且在調試後看到壓力測試的情況還是比較爽的。
在緩存的選擇上有過很多的思考,雖然說memcached結合java在序列化上性能不怎麼樣,不過也沒有更好的集羣環境下的緩存解決方案了,就選擇了memcached。本來計劃等公司買的服務器到位裝個linux再來研究memcached,但這兩天在找到了一個windows下的Memcached版本,就動手開始調整現有的框架了。

windows下的Server端很簡單,不用安裝,雙擊運行後默認服務端口是11211,沒有試着去更改端口,因爲反正以後會用unix版本,到時再記錄安裝步驟。下載客戶端的java API包,接口非常簡單,參考API手冊上就有現成的例子。

目標,對舊框架緩存部分進行改造:
1、緩存工具類
2、hibernate的provider
3、用緩存實現session機制

今天先研究研究緩存工具類的改造,在舊框架中部分函數用了ehcache對執行結果進行了緩存處理,現在目標是提供一個緩存工具類,在配置文件中配置使用哪種緩存(memcached或ehcached),使其它程序對具體的緩存不依賴,同時使用AOP方式來對方法執行結果進行緩存。
首先是工具類的實現:
在Spring中配置

	<!-- EhCache Manager -->
	<bean id="cacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation">
			<value>classpath:ehcache.xml</value>
		</property>
	</bean>

	<bean id="localCache"
		class="org.springframework.cache.ehcache.EhCacheFactoryBean">
		<property name="cacheManager" ref="cacheManager" />
		<property name="cacheName"
			value="×××.cache.LOCAL_CACHE" />
	</bean>
	
	<bean id="cacheService"
		class="×××.core.cache.CacheService" init-method="init" destroy-method="destory">
		<property name="cacheServerList" value="${cache.servers}"/>
		<property name="cacheServerWeights" value="${cache.cacheServerWeights}"/>
		<property name="cacheCluster" value="${cache.cluster}"/>
		<property name="localCache" ref="localCache"/>
	</bean>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章