1. 程式人生 > >spring boot 使用ehcache 實現快取

spring boot 使用ehcache 實現快取

所謂快取是一種儲存機制,可將資料儲存在某一個地方,並以一種更快的方式為以後的請求提供服務

spring 對於快取提供了宣告式快取註解 ,並提供了四種類型的宣告式快取註解(同樣是使用了AOP 技術實現),這些註解定義了那些 方法的返回值將要被快取或者從快取儲存器中移除 ,需要注意的是,只有使用public 定義的方法才可以被快取,當在一個類上使用註解時,該類中的每個公共方法都將被快取到給定的儲存器中或者從給定的儲存器中移除

這四個註解如下

  1. @Cacheable
    應用到讀取資料的方法上,即可快取的方法,如查詢方法:先從快取中讀取,如果沒有,再呼叫方法獲取資料,然後把資料新增到快取中,適用於查詢 @Cacheable 有以下屬性
    value: 用於指定快取器的名稱 ,當然也可以在類上宣告快取器的名稱 使用@CacheConfig(cacheNames = “userCache”) 宣告
    key: 鍵生成器 ,快取值的鍵 ,在預設情況下,快取抽象使用方法簽名以及引數值作為一個鍵值 ,並將該鍵和方法呼叫的結果組成鍵值對 ,當然也可以使用 key 自定義鍵 同時 使用EL 表示式將值注入
    condition 條件快取 使用condition 屬性 ,可以根據條件對一個方法應用快取
  2. @CachePut
    該註解與Cacheable 完成相同的工作,它通常首先執行方法,然後返回值到快取。 該註解適合使用返回值來更新快取儲存器
  3. @CacheEvict
    將一條或多條資料從快取中刪除,該註解常用於使用者更新或刪除操作對現有資料進行操作 也提供了 key 和 condition 屬性 ,可以通過這些屬性完成自定義鍵和條件
  4. @Caching
    通過該註解可以組合多個註解策略在一個方法上

spring boot 整合ehcache 實現資料快取

  1. 加入依賴
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>
		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache</artifactId>
		</dependency>
  1. 配置 eache.xml 檔案
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <cache name="userCache"
           eternal="false"
           maxEntriesLocalHeap="0"
           timeToIdleSeconds="12000"/>
	<!--  name 表示快取名,可以配置多個 ,在需要使用cache 的地方使用 @CacheConfig(cacheNames = "cacheName") 引用 -->
    <!-- eternal:true表示物件永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false -->
    <!-- maxEntriesLocalHeap:堆記憶體中最大快取物件數,0沒有限制 -->
    <!-- timeToIdleSeconds: 設定允許物件處於空閒狀態的最長時間,以秒為單位。當物件自從最近一次被訪問後,
    如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期,EHCache將把它從快取中清空。
    只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示物件可以無限期地處於空閒狀態 -->
</ehcache>
  1. 在啟動類上使用@EnableCaching 註解
@SpringBootApplication
@EnableCaching
public class SpingbootmybatisApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpingbootmybatisApplication.class, args);
	}
}
  1. 在具體方法上使用對應的ehcache 標籤 以及@CacheConfig(cacheNames = “cacheName”) 設定了ehcache的名稱,這個名稱就是ehcache.xml內的名稱
    /**
     *    @Cacheable(key = "#id") 應用到讀取資料的方法上,即可快取的方法,如查詢方法:先從快取中讀取,如果沒有再調 用方法獲取資料,然後把資料新增到快取中,適用於查詢
     * @param id
     * @return
     */
    @Cacheable(key = "#id")
    @Override
    public User findUserById(int id) {
        return userMapper.selectByPrimaryKey(id);
    }

/**
     *     @CachePut 主要針對方法配置,能夠根據方法的請求引數對其結果進行快取,和 @Cacheable 不同的是,它每次都會觸發真實方法的呼叫。適用於更新和插入
     * @param user
     */
    @Override
    @CachePut
    public void insertUser(User user) {
        userMapper.insertSelective(user);
    }
/**
     * @CacheEvict 主要針對方法配置,能夠根據一定的條件對快取進行清空。適用於刪除
     * @param id
     */
    @CacheEvict(key = "#id")
    @Override
    public void deleteUserById(int id) {
        userMapper.deleteByPrimaryKey(id);
    }

快取的使用,很多時候需要根據實際的業務邏輯進行選擇和設定。 更多的是需要和業務場景匹配已達到最好的使用效果,當然也可以使用redis 來實現(主要是通過修改cacheManager 來實現),後面會接著更新