SpringBoot2-第五章:整合EhCache

pc859107393發表於2019-03-04

上一章我們簡單的介紹了Springboot的使用Gson作為訊息解析器,這一章我們來在springboot中使用一下快取相關的註解。

本專案的GitHub:https://github.com/pc859107393/Go2SpringBoot.git

有興趣交流springboot進行快速開發的同學可以加一下下面的企鵝群。

行走的java全棧

使用SpringBoot的快取註解

在番外篇中,我已經介紹過springcache的註解,同樣的我們在原始碼中去分析可以看到SpringBoot已經預先設定了一些常用的快取,我們可以看看都有哪些東西:

  • org.springframework.cache
    • concurrent
      • ConcurrentMapCache 使用ConcurrentMap作為快取技術(預設)
    • support
      • AbstractCacheManager CacheManager的抽象
      • NoOpCache 不會實際儲存的簡單快取
      • SimpleCacheManager 簡單快取,常用於測試
    • ehcache
      • EhCacheCache
    • CaffeineCache
      • CaffeineCache
    • jcache
      • JCacheCache
    • transaction
      • AbstractTransactionSupportingCacheManager 抽象的支援事務的快取管理器

當然上面的這些類,只是springboot預設整合的,要想使用快取,首先我們需要在SpringBoot的入口類中加入對應的註解來開啟快取。

@SpringBootApplication
@EnableWebMvc
@EnableSwagger2
@MapperScan(value = ["cn.acheng1314.base.dao"])
@Configuration
@EnableTransactionManagement
@EnableCaching  //使用這個註解開啟快取
class BaseApplication : WebMvcConfigurer {
    //···省略程式碼
}
複製程式碼

當然預設的Spring會使用ConcurrentMapCacheManager,如何使用EhCache呢?我們需要在配置檔案中做出修改。首先加入Ehcache的依賴:compile `net.sf.ehcache:ehcache:2.10.5` ,再接著我們在配置檔案中約定好Ehcache的配置,如下:

#Ehcache配置
spring.cache.ehcache.config=classpath:/ehcache.xml
spring.cache.type=ehcache
複製程式碼

這樣寫玩了就完事了嗎? 然而並沒有,我們需要先實現ehcache的配置,再service層實現註解才能使快取生效,如下:

<!--這裡是我們的ehcache配置-->
<ehcache
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        updateCheck="false">
    <!--快取路徑,使用者目錄下的base_ehcache目錄-->
    <diskStore path="user.home/base_ehcache"/>  

    <defaultCache
            maxElementsInMemory="20000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>
    <!--快取檔名:cache_user,同樣的可以配置多個快取-->
    <cache name="cache_user"
           maxElementsInMemory="20000"
           eternal="true"
           overflowToDisk="true"
           diskPersistent="false"
           timeToLiveSeconds="0"
           diskExpiryThreadIntervalSeconds="120"/>

</ehcache>
複製程式碼

接著我們來看看快取註解在service層的應用。在我的番外篇中已經介紹過各個註解的使用了,這裡不在闡述,例項如下:

import cn.acheng1314.base.dao.UserDao
import cn.acheng1314.base.domain.User
import com.baomidou.mybatisplus.plugins.pagination.Pagination
import com.baomidou.mybatisplus.service.impl.ServiceImpl
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.cache.annotation.CacheConfig
import org.springframework.cache.annotation.Cacheable
import org.springframework.stereotype.Service
import kotlin.collections.ArrayList

@Service(value = "userService") 
//這裡需要和配置檔案的cache的name對應,否則產生異常某個名為XX的快取找不到
@CacheConfig(cacheNames = ["cache_user"])  
class UserServiceImpl : ServiceImpl<UserDao, User>() {

    @Autowired
    lateinit var userDao: UserDao

    fun findUserByPage(pageNum: Int, pageSize: Int): ArrayList<User> {
        return try {
            val pagination = Pagination(pageNum, pageSize)
            setTotalPage(pagination.pages)
            userDao.findAllByPage(pagination)
        } catch (e: Exception) {
            arrayListOf()
        }
    }

    var totalPage: Long? = null
    fun setTotalPage(pages: Long) {
        this.totalPage = pages
    }

    @Cacheable(sync = true)
    fun findAll() = baseMapper.selectList(null)

}
複製程式碼

到這裡我們執行一下專案,可以看到第一次訪問的時候速度會比後面的速度慢一點點,同樣的我們手動在資料庫中新增一個值,再來訪問這個,會發現手動新增的不會被讀出來,所以可以證明我們的快取建立成功了。

具體的效果可以看下截圖:

圖5-1 快取成功後,左邊資料庫手動插入後,右邊的快取資料中並未出現手動插入資料

在上面的圖中,我們明顯的看到,作圖中我手動插入一段資料後,在右圖中並沒有顯示出來說明我們快取建立成功了。

具體更多細節程式碼,請看我的專案原始碼,謝謝閱讀。

相關文章