日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot @Cacheable缓存注解的使用

發(fā)布時間:2025/3/19 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot @Cacheable缓存注解的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1. 引入緩存依賴
  • 2. application.properties 配置
  • 3. 準(zhǔn)備基本的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: 123456

3. 準(zhǔn)備基本的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

指定緩存的名字,可以通過數(shù)組的方式指定多個緩存。

@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;}

運(yùn)行SpringBoot程序,在瀏覽器輸入 http://localhost:99/redis/getString1?name=fuhb,然后查看Redis緩存確認(rèn)是否生成對應(yīng)的key

127.0.0.1:6379[5]> KEYS * 1) "REDIS:GETSTRING1::fuhb"

由此可見,默認(rèn)會以 value + 參數(shù)的格式生成 Redis Key。

如果是多個參數(shù)的情況下,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"

由此可見,參數(shù)以 SimpleKey [參數(shù)拼接] 的格式進(jìn)行組合。所以,接下來講一下 key 和 keyGenerator 屬性的使用

4.2 key 和 keyGenerator

keyGenerator

SpringBoot默認(rèn)使用的是SimpleKeyGenerator生成key,其生成規(guī)則如下:

  • 當(dāng)參數(shù)為空時,返回空
  • 當(dāng)參數(shù)只有一個時,返回第一個參數(shù)的值
  • 當(dāng)參數(shù)大于一個時,返回SimpleKey對象,其序列化格式上面講過了,代碼比較簡單
public String toString() {return this.getClass().getSimpleName() + " [" + StringUtils.arrayToCommaDelimitedString(this.params) + "]";}

如果需要自定義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來替代參數(shù)名

@Override@Cacheable(value = {"REDIS:GETSTRING4"}, key = "#p0 + #p1")public String getString4(String tag, String name) {return tag + " " + name;}

key 和 keyGenerator 參數(shù)是互斥的,不能同時使用

4.3 cacheManager 和 cacheResolver

CacheManager,緩存管理器是用來管理(檢索)一類緩存的。通常來講,緩存管理器是與緩存組件類型相關(guān)聯(lián)的。我們知道,spring 緩存抽象的目的是為使用不同緩存組件類型提供統(tǒng)一的訪問接口,以向開發(fā)者屏蔽各種緩存組件的差異性。那么 CacheManager 就是承擔(dān)了這種屏蔽的功能。spring 為其支持的每一種緩存的組件類型提供了一個默認(rèn)的 manager,如:RedisCacheManager 管理 redis 相關(guān)的緩存的檢索、EhCacheManager 管理 ehCache 相關(guān)的緩等。

CacheResolver,緩存解析器是用來管理緩存管理器的,CacheResolver 保持一個 cacheManager 的引用,并通過它來檢索緩存。CacheResolver 與 CacheManager 的關(guān)系有點類似于 KeyGenerator 跟 key。spring 默認(rèn)提供了一個 SimpleCacheResolver,開發(fā)者可以自定義并通過 @Bean 來注入自定義的解析器,以實現(xiàn)更靈活的檢索。

大多數(shù)情況下,我們的系統(tǒng)只會配置一種緩存,所以我們并不需要顯式指定 cacheManager 或者 cacheResolver。但是 spring 允許我們的系統(tǒng)同時配置多種緩存組件,這種情況下,我們需要指定。指定的方式是使用 @Cacheable 的 cacheManager 或者 cacheResolver 參數(shù)。

4.4 sync

sync=true表示同步,也就是緩存的入口將被鎖住,直到上一個線程的操作完成,可以避免緩存擊穿的問題。默認(rèn)情況是false,也就是異步訪問,初始狀態(tài)下緩存不存在,如果有大量的線程同時訪問,會因為沒有緩存而對DB造成較大壓力。

4.5 condition

緩存的條件,只有當(dāng)condition返回結(jié)果為true才使用緩存。該配置支持SpEL表達(dá)式,也可以使用result表示取返回值

如下例子,只有當(dāng)name的值等于admin時,才會構(gòu)造并使用緩存

@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相反

如下例子,當(dāng)name的值等于admin時不使用緩存

@Override@Cacheable(value = {"REDIS:GETSTRING6"}, key = "#p0 + #p1", unless = "#name == 'admin'")public String getString6(String tag, String name) {return tag + " " + name;}

總結(jié)

以上是生活随笔為你收集整理的SpringBoot @Cacheable缓存注解的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。