1. 程式人生 > >mybatis整合分散式快取框架

mybatis整合分散式快取框架

什麼是分散式快取

為了提高系統的併發效能,通常會對系統進行分散式部署(如叢集部署方式)
在這裡插入圖片描述
如上圖,伺服器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

  1. 加入ehcache包
    在這裡插入圖片描述
  2. 在相應的mapper.xml配置檔案中進行配置,將cache標籤的type屬性設定成Ehcache對mybatis的Cache介面的實現型別 EhcacheCache
    在這裡插入圖片描述
  3. 加入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(先進先出)