什麼是分佈式緩存
爲了提高系統的併發性能,通常會對系統進行分佈式部署(如集羣部署方式)
如上圖,服務器1上的mybatis的二級緩存位於服務器1上,服務器2上的mybatis的二級緩存位於服務器2上。
所以如果不使用分佈式緩存,緩存的數據就會在各個服務器上單獨存儲,因此,需要使用分佈式緩存工具對緩存數據進行集中管理。
mybatis無法實現分佈式緩存,所以需要和第三方分佈式緩存框架進行整合,如redis, memcached, ehcache等。
即使拋開分佈式緩存,就普通緩存來說,mybatis也不是專業做緩存的。緩存數據是在內存中存儲的,緩存工具需要對數據進行一些壓縮處理,或安全的編碼處理等,mybatis只是簡單地把數據存到內存中了。
整合方法
mybatis提供了一個cache接口,如果要實現自己的緩存邏輯,可以通過實現cache接口進行開發。 比如 mybatis 和 ehcache 的整合包中就提供了一個cache接口的實現類。
如果要將mybatis和redis進行整合,就需要考慮如何實現這個cache接口,然後在接口內部去操作redis的數據結構。
getId(), 即獲取cache的唯一標識,即key值
putObject(key, value),向緩存中寫入數據,value是select查詢出來的結果集
getObject(key) , 根據key值,從緩存中取出value
mybatis的一級緩存和二級緩存都是以HashMap結構存儲的。
PerpetualCache是mybatis默認實現的Cache類,可以仿照這個寫cache實現類。
在相應的mapper.xml配置文件中,配置該mapper的二級緩存:
mybatis整合ehcache
- 加入ehcache包
- 在相應的mapper.xml配置文件中進行配置,將cache標籤的type屬性設置成Ehcache對mybatis的Cache接口的實現類型 EhcacheCache
- 加入ehcache的配置文件
在classpath下創建ehcache.xml配置文件,配置如下內容:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
屬性說明:
diskStore:指定數據在磁盤中的存儲位置。
defaultCache:當藉助CacheManager.add(“demoCache”)創建Cache時,EhCache便會採用指定的的管理策略
以下屬性是必須的:
maxElementsInMemory - 在內存中緩存的element的最大數目
maxElementsOnDisk - 在磁盤上緩存的element的最大數目,若是0表示無窮大
eternal - 設定緩存的elements是否永遠不過期。如果爲true,則緩存的數據始終有效,如果爲false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
overflowToDisk - 設定當內存緩存溢出的時候是否將過期的element緩存到磁盤上
以下屬性是可選的:
timeToIdleSeconds - 當緩存在EhCache中的數據前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些數據便會刪除,默認值是0,也就是可閒置時間無窮大
timeToLiveSeconds - 緩存element的有效生命期,默認是0.,也就是element存活時間無窮大
diskSpoolBufferSizeMB 這個參數設置DiskStore(磁盤緩存)的緩存區大小.默認是30MB.每個Cache都應該有自己的一個緩衝區.
diskPersistent - 在VM重啓的時候是否啓用磁盤保存EhCache中的數據,默認是false。
diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運行間隔,默認是120秒。每個120s,相應的線程會進行一次EhCache中數據的清理工作
memoryStoreEvictionPolicy - 當內存緩存達到最大,有新的element加入的時候, 移除緩存中element的策略。默認是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)