首頁  >  文章  >  資料庫  >  關於spring redis註解實作快取機制

關於spring redis註解實作快取機制

藏色散人
藏色散人轉載
2020-11-02 14:08:192153瀏覽

以下由Redis教學欄位來介紹關於spring redis註解實作快取機制,希望對需要的朋友有幫助!

1、xml設定

 <bean id="poolConfigTax" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxIdle" value="${redis_tax.maxIdle}" />  
        <property name="minIdle" value="${redis_tax.minIdle}" />  
        <property name="maxTotal" value="${redis_tax.maxTotal}" />
        <property name="testOnBorrow" value="${redis_tax.testOnBorrow}" />  
    </bean>  
    <!-- Tax redis 数据库  -->
    <bean id="connectionFactoryTax" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"   
        p:host-name="${redis_tax.host}" p:port="${redis_tax.port}" p:password="${redis_tax.pass}"  p:pool-config-ref="poolConfigTax"
        p:database="0"/>  
    <!--redis操作模版,使用该对象可以操作redis  -->  
    <bean id="redisTemplateTax" class="org.springframework.data.redis.core.RedisTemplate" >    
        <property name="connectionFactory" ref="connectionFactoryTax" />    
        <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can&#39;t cast to String!!  -->    
        <property name="keySerializer" >    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    
        </property>    
        <property name="valueSerializer" >    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    
        </property>    
        <property name="hashKeySerializer">    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    
        </property>    
        <property name="hashValueSerializer">    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    
        </property>    
        <!--开启事务  -->  
        <property name="enableTransactionSupport" value="false"></property>  
    </bean>   
    <!-- 配置RedisCacheManager -->
    <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg name="redisOperations" ref="redisTemplateTax" />
    </bean>
    <cache:annotation-driven cache-manager="redisCacheManager"/>

2、快取註解@Cacheable、@CacheEvict、@CachePut詳解
一、@Cacheable用法詳解
1、用在哪裡?用在方法或類別上。
2、這兩種用法有什麼差別?
 用在方法上表示:此方法的回傳值將會被快取起來 
 用在類別上表示:表示該類別的所有方法都支援該註解
3、使用後的結果為何?下次使用相同方法和相同參數呼叫這個方法的時候將直接從緩訪問值,而不需要再次執行該方法。
4、回傳值在快取中怎麼儲存的?以鍵值對的方式儲存在快取中,value就是回傳值,key由兩種策略產生:預設策略和自訂策略
5、預設策略和預設策略怎麼用?
  預設策略:在value值後雙「::」拼接,形參列表,當形參是物件時,使用json格式:

@CacheConfig(cacheNames="enterprise")//<!-- 声明缓存使用的缓存名称 -->
public interface EnterpriseRepo extends JpaRepository<Enterprise, Integer>,JpaSpecificationExecutor<Enterprise>{
    @Cacheable(value="cash1")
    Enterprise findByid(Integer id);

    @CachePut(value="cash1")
    Enterprise save(Enterprise enterprise);

}

  自訂策略:key屬性是用來指定Spring快取方法的傳回結果時對應的key的。此屬性支援SpringEL表達式。當我們沒有指定該屬性時,Spring將使用預設策略來產生key。

    自訂策略是指我們可以透過Spring的EL表達式來指定我們的key。這裡的EL表達式可以使用方法參數及它們對應的性質。使用方法參數時我們可以直接使用「#參數名稱」或「#p參數index」。下面是幾個使用參數作為key的範例。

@Cacheable(value="users", key="#id")

   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#p0")
   public User find(Integer id) {
      return null;
   }

   @Cacheable(value="users", key="#user.id")
   public User find(User user) {
      return null;
   }

   @Cacheable(value="users", key="#p0.id")
   public User find(User user) {
      return null;
   }

  除了上述使用方法參數作為key之外,Spring也為我們提供了一個root物件可以用來產生key。透過該root物件我們可以獲得到以下資訊。

當我們要使用root物件的屬性作為key時我們也可以將「#root」省略,因為Spring預設使用的就是root物件的屬性。如:

@Cacheable(value={"users", "xxx"}, key="caches[1].name")

public User find(User user) {
   return null;
}

6、condition屬性指定發生的條件

  有的時候我們可能不會想要快取一個方法所有的回傳結果。透過condition屬性可以實現這項功能。 condition屬性預設為空,表示將快取所有的呼叫情況。其值是透過SpringEL表達式來指定的,當為true時表示進行快取處理;當為false時表示不進行快取處理,即每次呼叫該方法時該方法都會執行一次。如下範例表示只有當user的id為偶數時才會進行快取。

@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
public User find(User user) {
   System.out.println("find user by user " + user);
   return user;
}

二、@CachePut

在支援Spring Cache的環境下,對於使用@Cacheable標註的方法,Spring在每次執行前都會檢查Cache中是否存在相同key的快取元素,如果存在就不再執行該方法,而是直接從快取中獲取結果進行返回,否則才會執行並將返回結果存入指定的快取中。 @CachePut也可以聲明一個方法支援快取功能。與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
  一般使用在保存,更新方法中。

    @CachePut也可以標示在類別上和方法上。使用@CachePut時我們可以指定的屬性跟@Cacheable是一樣的。

    @CachePut(“users”)//每次都會執行方法,並將結果存入指定的快取中

public User find(Integer id) {
      return null;
}

三、@CacheEvict

# @CacheEvict是用來標註在需要清除快取元素的方法或類別上的。當標記在一個類別上時表示其中所有的方法的執行都會觸發快取的清除操作。 @CacheEvict可以指定的屬性有value、key、c​​ondition、allEntries和beforeInvocation。其中value、key和condition的語意與@Cacheable對應的屬性類似。即value表示清除操作是發生在哪些Cache上的(對應Cache的名稱);key表示需要清除的是哪個key,如未指定則會使用預設策略產生的key;condition表示清除作業發生的條件。下面我們來介紹一下新出現的兩個屬性allEntries和beforeInvocation。
1、 allEntries屬性
allEntries是boolean類型,表示是否需要清除快取中的所有元素。預設為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。有的時候我們需要Cache一下清除所有的元素,這比一個一個清除元素更有效率。

@CacheEvict(value="users", allEntries=true)
public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
}

2、beforeInvocation屬性
 清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為拋出例外而未能成功返回時也不會觸發清除操作。使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在呼叫方法之前清除快取中的指定元素。

@CacheEvict(value="users", beforeInvocation=true)
public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
}

以上是關於spring redis註解實作快取機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除