javascript
SpringBoot @Cacheable缓存注解的使用
文章目錄
- 1. 引入緩存依賴
- 2. application.properties 配置
- 3. 準備基本的Controller、Service代碼
- 4. @Cacheable注解
- 4.1 cacheNames和value
- 4.2 key 和 keyGenerator
- 4.3 cacheManager 和 cacheResolver
- 4.4 sync
- 4.5 condition
- 4.6 unless
1. 引入緩存依賴
<!----><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!--這邊用的是Redis緩存,所以加上這個依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2. application.properties 配置
spring:cache:type: redisredis:database: 5host: 192.168.25.129port: 6379password: 1234563. 準備基本的Controller、Service代碼
public interface RedisService {String getString(String name); } @Service public class RedisServiceImpl implements RedisService {@Overridepublic String getString(String name) {return "hello " + name;} } @RestController @RequestMapping("/redis") public class RedisController {@Autowiredprivate RedisService redisService;@RequestMapping("/getString1")public String getString1(@RequestParam String name){return redisService.getString(name);} }4. @Cacheable注解
4.1 cacheNames和value
指定緩存的名字,可以通過數組的方式指定多個緩存。
@AliasFor("cacheNames")String[] value() default {};@AliasFor("value")String[] cacheNames() default {};修改前面的代碼,在ServiceImpl的方法上,加上@Cacheable注解并指定value屬性
@Override@Cacheable(value = {"REDIS:GETSTRING1"})public String getString(String name) {return "hello " + name;}運行SpringBoot程序,在瀏覽器輸入 http://localhost:99/redis/getString1?name=fuhb,然后查看Redis緩存確認是否生成對應的key
127.0.0.1:6379[5]> KEYS * 1) "REDIS:GETSTRING1::fuhb"由此可見,默認會以 value + 參數的格式生成 Redis Key。
如果是多個參數的情況下,Redis Key會是什么格式呢?
@RequestMapping("/getString2")public String getString2(@RequestParam String name){return redisService.getString(name, "test");} @Override@Cacheable(value = {"REDIS:GETSTRING2"})public String getString(String name, String tag) {return tag + " " + name;}同樣的,在瀏覽器輸入 http://localhost:99/redis/getString2?name=fuhb,再查看Redis Key信息
127.0.0.1:6379[5]> KEYS * 1) "REDIS:GETSTRING2::SimpleKey [fuhb,test]" 2) "REDIS:GETSTRING1::fuhb"由此可見,參數以 SimpleKey [參數拼接] 的格式進行組合。所以,接下來講一下 key 和 keyGenerator 屬性的使用
4.2 key 和 keyGenerator
keyGenerator
SpringBoot默認使用的是SimpleKeyGenerator生成key,其生成規則如下:
- 當參數為空時,返回空
- 當參數只有一個時,返回第一個參數的值
- 當參數大于一個時,返回SimpleKey對象,其序列化格式上面講過了,代碼比較簡單
如果需要自定義KeyGenerator,可以參考這篇文章:@Cacheable自定義KeyGenerator
key
相較于keyGenerator,官方更推薦直接顯示地指定key
@Override@Cacheable(value = {"REDIS:GETSTRING3"}, key = "#tag + #name")public String getString4(String tag, String name) {return tag + " " + name;}或者用這種寫法,p0、p1來替代參數名
@Override@Cacheable(value = {"REDIS:GETSTRING4"}, key = "#p0 + #p1")public String getString4(String tag, String name) {return tag + " " + name;}key 和 keyGenerator 參數是互斥的,不能同時使用
4.3 cacheManager 和 cacheResolver
CacheManager,緩存管理器是用來管理(檢索)一類緩存的。通常來講,緩存管理器是與緩存組件類型相關聯的。我們知道,spring 緩存抽象的目的是為使用不同緩存組件類型提供統一的訪問接口,以向開發者屏蔽各種緩存組件的差異性。那么 CacheManager 就是承擔了這種屏蔽的功能。spring 為其支持的每一種緩存的組件類型提供了一個默認的 manager,如:RedisCacheManager 管理 redis 相關的緩存的檢索、EhCacheManager 管理 ehCache 相關的緩等。
CacheResolver,緩存解析器是用來管理緩存管理器的,CacheResolver 保持一個 cacheManager 的引用,并通過它來檢索緩存。CacheResolver 與 CacheManager 的關系有點類似于 KeyGenerator 跟 key。spring 默認提供了一個 SimpleCacheResolver,開發者可以自定義并通過 @Bean 來注入自定義的解析器,以實現更靈活的檢索。
大多數情況下,我們的系統只會配置一種緩存,所以我們并不需要顯式指定 cacheManager 或者 cacheResolver。但是 spring 允許我們的系統同時配置多種緩存組件,這種情況下,我們需要指定。指定的方式是使用 @Cacheable 的 cacheManager 或者 cacheResolver 參數。
4.4 sync
sync=true表示同步,也就是緩存的入口將被鎖住,直到上一個線程的操作完成,可以避免緩存擊穿的問題。默認情況是false,也就是異步訪問,初始狀態下緩存不存在,如果有大量的線程同時訪問,會因為沒有緩存而對DB造成較大壓力。
4.5 condition
緩存的條件,只有當condition返回結果為true才使用緩存。該配置支持SpEL表達式,也可以使用result表示取返回值
如下例子,只有當name的值等于admin時,才會構造并使用緩存
@Override@Cacheable(value = {"REDIS:GETSTRING5"}, key = "#p0 + #p1", condition = "#name == 'admin'")public String getString5(String tag, String name) {return tag + " " + name;}4.6 unless
不使用緩存的條件,跟上面的condition相反
如下例子,當name的值等于admin時不使用緩存
@Override@Cacheable(value = {"REDIS:GETSTRING6"}, key = "#p0 + #p1", unless = "#name == 'admin'")public String getString6(String tag, String name) {return tag + " " + name;}總結
以上是生活随笔為你收集整理的SpringBoot @Cacheable缓存注解的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot @Cacheabl
- 下一篇: SpringBoot @Valid各种注