spring增加快取最簡單的方法
阿新 • • 發佈:2019-06-04
新增配置資訊
(1).config/config.properties檔案中新增
#快取預設有效期1h (60 * 60 = 3600秒)
redis.expiration=3600
#最大空閒數,資料庫連線的最大空閒時間。超過空閒時間,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制。
redis.maxIdle=300
#連線池的最大資料庫連線數。設為0表示無限制。
#Redis預設允許客戶端連線的最大數量是10000。若是看到連線數超過5000以上,那可能會影響Redis的效能。倘若一些或大部分客戶端傳送大量的命令過來,這個數字會低的多。
redis.maxActive=5000
#最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
redis.maxWait=-1
#申請連線時檢測連線是否有效,配置true會降低效能,但是可以檢測連結有效性,預設false
redis.testOnBorrow=true
#返回前會先校驗這個連結有效性,如果無效會被銷燬,預設值false
redis.testOnReturn=true
redis.database=0
#快取時間範圍
cache.cacheTime=300,400
#同步等待時間
cache.syncWaitTime=300
#空值快取時間
cache.nullCacheTime=60
(2).config資料夾下新增spring-data-redis.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.3.xsd">
<description>Jedis Configuration</description>
<!-- 載入配置屬性檔案 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:config/config.properties"/>
<!-- ******************** redis快取 **********************-->
<!-- 啟用快取註解功能,否則註解不會生效 -->
<cache:annotation-driven cache-manager="cacheManager" />
<!-- redis 相關配置 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="${redis.testOnReturn}" />
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}"
p:database="${redis.database}" p:timeout="${redis.timeout}"
p:pool-config-ref="poolConfig" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!--對key的序列化器 -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<!--是對value的列化器 預設:JdkSerializationRedisSerializer -->
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
</bean>
<!-- 擴充套件RedisCacheManager -->
<bean id="cacheManager" class="com.we.core.web.cache.TFRedisCacheManager">
<constructor-arg ref="redisTemplate" />
<!-- 是否使用字首 預設: -->
<!--<property name="usePrefix" value="true" />-->
<!-- 預設有效期1h (60 * 60 = 3600秒) -->
<property name="defaultExpiration" value="${redis.expiration}" />
</bean>
<!-- ******************** redis快取 **********************-->
</beans>
(3).config/spring-context.xml中新增
<import resource="spring-data-redis.xml" />
註解使用
概況
基於註解的快取宣告,需要掌握的有:@Cacheable、@CachePut 、 @CacheEvict 和@Caching
以下列舉了幾種常用的使用屬性,詳情可自行查閱
@Cacheable(value="",condition="",key="",unless="")
public @interface Cacheable{
String[] value(); //快取的名字,可以把資料寫到多個快取,我們擴充套件了屬性:area#60*10, area是value,60*10是快取時間(單位秒),不加走預設(1h)
String key() default ""; //快取key,如果不指定將使用預設的KeyGenerator生成,後邊介紹
String condition() default ""; //滿足快取條件的資料才會放入快取,condition在呼叫方法之前和之後都會判斷
String unless() default ""; //用於否決快取更新的,不像condition,該表達只在方法執行之後判斷,此時可以拿到返回值result進行判斷了
String keyGenerator() default ""; //指定key規則
}
@CachePut(value="",condition="",key="",unless="")
public @interface CachePut {
String[] value(); //快取的名字,可以把資料寫到多個快取
String key() default ""; //快取key,如果不指定將使用預設的KeyGenerator生成,後邊介紹
String condition() default ""; //滿足快取條件的資料才會放入快取,condition在呼叫方法之前和之後都會判斷
String unless() default ""; //用於否決快取更新的,不像condition,該表達只在方法執行之後判斷,此時可以拿到返回值result進行判斷了
}
@Cacheable(value="",condition="",key="",unless="")
public @interface CacheEvict {
String[] value(); //快取的名字,可以把資料寫到多個快取
String key() default ""; //快取key,如果不指定將使用預設的KeyGenerator生成,後邊介紹
String condition() default ""; //滿足快取條件的資料才會放入快取,condition在呼叫方法之前和之後都會判斷
boolean allEntries() default false; //是否移除所有資料
boolean beforeInvocation() default false;//是呼叫方法之前移除/還是呼叫之後移除
@Caching(value="",condition="",key="",unless="")
public @interface Caching {
Cacheable[] cacheable() default {}; //從快取獲取多個,如果沒有則執行方法體,獲取值後加入快取
CachePut[] put() default {}; //快取多個
CacheEvict[] evict() default {}; //從快取移除多個
}
@Cacheable
較常用,用在查詢方法上,先從快取中讀取,如果快取不存在再呼叫該方法獲取資料,然後把返回的資料新增到快取中去
正如其名字,@Cacheable用於新增在需快取記憶體的方法上。這些方法預設會以引數為主鍵把返回結果儲存到快取記憶體中,以便在隨後的呼叫(使用相同的引數)方法,直接返回快取記憶體中的值,不需要實際執行此方法。
-
最簡單的方式,只需要宣告一個相關快取策略的名稱
@Cacheable("area#60*10")
public Book getAreaVersion4(String code) {...}
-
也可以設定多個緩衝塊,其中一個緩衝塊命中即會返回,並會同步其他快取塊:
@Cacheable(value = {"area#60*10","city#60*30"})
public Book getAreaVersion4(String code) {...}
-
定製key,且加同步
@Cacheable(value = {"area#60*10"}, key = "'code:'+#code",sync = true)
public AreaDto getAreaVersion4(String code) {
return areaBaseService.get (code);
}
-
定製key,且加同步,加條件
@Cacheable(value = {"area#60*10"}, key = "'code:'+#code",sync = true, condition = "#code=='100000'")
public AreaDto getAreaVersion4(String code) {
return areaBaseService.get (code);
}
@CacheEvict
主要對方法配置,用來標記要清空快取的方法,當這個方法被呼叫並滿足一定條件後,即會清空快取。
- 引數解析:
value:快取的位置,不能為空。
key:快取的key,預設為空。
condition:觸發的條件,只有滿足條件的情況才會清楚快取,預設為空,支援SpEL。
allEntries:true表示清除value中的全部快取,預設為false。
/**
* 情況area#60*10下所有快取
*/
@CacheEvict(value = {"area#60*10"}, key = "'code:'+#code", condition = "#code=='100000'")
public AreaDto delete(String code) {
return areaBaseService.delete (code);
}
/**
* 只要執行了delArea2方法,就重新整理快取名為”getAreaVersion4”下面的所有快取
*/
@Caching(evict = {@CacheEvict(value = {"getAreaVersion4#60*5"}, allEntries = true)})
public void delArea2() {
}
@CachePut
主要針對方法的配置,能夠根據方法的請求引數對其結果進行快取,和@Cacheable不同的是,它每次都會觸發真實方法的呼叫。
@CachePut(value = {"area#60*10"}, key = "'code:'+#code",sync = true, condition = "#code=='100000'")
public AreaDto getAreaVersion4(String code) {
return areaBaseService.get (code);
}
其他自行查閱
spring-data-redis
自定義快取註解
1.更新專案包
- we-core-web
2.新增預設配置
-
在apollo中新增 或者 在config/config.properties中新增
優先順序順序:1、apollo;2、配置檔案;
#快取時間範圍
cache.cacheTime=300,400
#同步等待時間
cache.syncWaitTime=3
#空值快取時間
cache.nullCacheTime=60
3.應用
-
使用demo
/**
* 目標方法
* <p&
* 支援限流
* 支援穿透
* 支援非同步處理
* </p&
*
* @param code
* @return
*/
@TFCacheable(groupName = CACHE_GROUP_NAME, cacheTime = {300, 400}, syncWaitTime = 300)
public AreaDto getXXX(String code) {
return xxxBaseService.get (code);
}
註解介紹
/**
* 分組名
*/
String groupName() default "";
/**
* 快取的時間範圍
* <br/&
* 過期時間,單位為秒
*
* <p&
* 格式:minTime-maxTime,如:60-120
* </p&
*/
int[] cacheTime() default 0;
/**
* 是否同步
* 同步排隊時間:{@link #syncWaitTime}.
* <p&
* 細粒度同步鎖,鎖定級別:引數級別
* </p&
* @see #syncWaitTime
*/
boolean sync() default true;
/**
* 同步等待時間
* <br/&
* 過期時間,單位為秒
*
* <p&
* 過期時間,單位為秒
* 如果開啟同步,預設排隊時間,超過後,拋超時異常
* </p&
* @see #sync
*/
int syncWaitTime() default 0;
/**
* 空值快取時間
*
* <p&
* 空值會快取短暫的時間,防止方法請求不斷請求資料庫,減少穿透機率
* </p&
*/
int nullCacheTime() default 0
@Cacheable(value = "ActivityScopeRedis#60*60",key = "#root.methodName + #activityId") public List<ActivityScopeDto> findByActivityId(long activityId) { return activityScopeBaseDao.findByActivityId(activityId); }
&n