常用注解及參數(shù):
@Cacheable(參數(shù))
該注解一般加在讀方法上,將方法返回的數(shù)據(jù)加到緩存。
參數(shù):
| 參數(shù)名 | 說(shuō)明 | 舉例 |
|---|---|---|
| value | 存到Redis中的key的前綴 | value="cache:test" |
| key | 存到Redis中key的后半部分 | key="#p0 + ':' + #p1" |
| unless | 不緩存的數(shù)據(jù) | unless="#result == null" |
| condition | 要緩存的數(shù)據(jù),與unless相反 |
表中 #p0 為參數(shù),0表示第一個(gè)參數(shù),依次類推。也可以直接寫參數(shù)名。
表中 #result 為方法返回結(jié)果。
@CacheEvict(參數(shù))
該注解一般加在寫方法上,刪除緩存中對(duì)應(yīng)的key。
參數(shù):
| 參數(shù)名 | 說(shuō)明 | 舉例 |
|---|---|---|
| value | 要?jiǎng)h除的key的前綴 | value="cache:test" |
| key | 要?jiǎng)h除的key的后半部分 | key="#p0 + ':' + #p1" |
| allEntries | 是否刪除value下的所有key | allEntries=true |
@Caching(參數(shù))
用于同時(shí)添加多個(gè)緩存注解,比如:
@Caching(evict={
@CacheEvict(...)
@CacheEvict(...)
...
})
key中的值為null的問(wèn)題
我在接口的方法上加了@Cacheable注解,如下:
@Cacheable(value="cache:test", key="'id='+#id",unless="#result==null")
String getNameById(Integer id);
然后Redis中的緩存key為:cache:test::id=null
究其原因,是因?yàn)閷?shí)現(xiàn)類的參數(shù)名不叫id。
key中參數(shù)的名字,必須與實(shí)現(xiàn)類中的參數(shù)名稱一致,才能取到值。
如果寫名字比較麻煩怕出錯(cuò),可以寫#p0,取第一個(gè)參數(shù),就跟名字脫離關(guān)系了。
另外,如果key中只有參數(shù),且這個(gè)參數(shù)又為null,那么就會(huì)報(bào)錯(cuò):
java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public java.lang.String com.xxx.service.impl.XXXServiceImpl.singleValue(java.lang.String)] caches=[cache:test:singleValue] | key='#id' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='#result == null' | sync='false'