最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot redis cache的key的使用方法

 更新時間:2019年05月12日 15:31:37   作者:Simeone_xu  
這篇文章主要介紹了Spring boot redis cache的key的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在數(shù)據(jù)庫查詢中我們往往會使用增加緩存來提高程序的性能,@Cacheable 可以方便的對數(shù)據(jù)庫查詢方法加緩存。本文主要來探究一下緩存使用的key。

搭建項目

數(shù)據(jù)庫

mysql> select * from t_student;
+----+--------+-------------+
| id | name  | grade_class |
+----+--------+-------------+
| 1 | Simone | 3-2     |
+----+--------+-------------+
1 row in set (0.01 sec)

spring boot 配置

#jpa
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/pratice
spring.datasource.username=root
spring.datasource.password=123456
#redis
spring.redis.host=localhost
spring.redis.lettuce.pool.maxActive=5
spring.redis.lettuce.pool.maxIdle=5
#cache
spring.cache.cache-names=Cache
spring.cache.redis.time-to-live=300000

數(shù)據(jù)訪問層

public interface StudentDao extends CrudRepository<Student, Long> {

  @Cacheable(value = "Cache")
  @Override
  Optional<Student> findById(Long aLong);

  @Cacheable(value = "Cache")
  Optional<Student> findByName(String name);
}

啟動調(diào)用數(shù)據(jù)訪問層方法觀察

@Override
public void run(ApplicationArguments args) throws Exception {
 Optional<Student> optional = studentDao.findById(1L);
 System.out.println(optional);
}

當(dāng)默認(rèn)使用 @Cacheable(value = "Cache") 的時候查看 redis 中緩存的 key

127.0.0.1:6379> keys *
1) "Cache::1"

可以知道 key是由緩存的名字和參數(shù)值生成的,key 的生成和方法的名字無關(guān),如果兩個方法的參數(shù)相同了,就會命中同一個緩存,這樣顯然是不行的。使用相同的參數(shù)調(diào)用 findById 和 findByName 觀察查詢結(jié)果

@Override
public void run(ApplicationArguments args) throws Exception {
 Optional<Student> optional = studentDao.findById(1L);
 System.out.println(optional);

 Optional<Student> optionalByName = studentDao.findByName("1");
 System.out.println(optionalByName);
}
//輸出結(jié)果
//Optional[Student(id=1, name=Simone, gradeClass=3-2)]
//Optional[Student(id=1, name=Simone, gradeClass=3-2)]

從數(shù)據(jù)庫的數(shù)據(jù)看 studentDao.findByName("1") 應(yīng)該是查詢出空的,但是取命中了緩存,所以我們需要給緩存的 key 加上方法的名字。

@Cacheable(value = "Cache", key = "{#root.methodName, #aLong}")
@Override
Optional<Student> findById(Long aLong);

@Cacheable(value = "Cache", key = "{#root.methodName, #name}")
Optional<Student> findByName(String name);

//Optional[Student(id=1, name=Simone, gradeClass=3-2)] 
//Optional.empty

Redis 中的 Key 也有了方法的名字

127.0.0.1:6379> keys *
1) "Cache::findById,1"
2) "Cache::findByName,1"

在實際項目中我們肯定不是只有一張表,如果其他表使用緩存的名字也是 Cache,很有可能產(chǎn)生相同的 key,比如我還有一個如下的 dao

public interface TeacherDao extends CrudRepository<Teacher, Long> {

  @Cacheable(value = "Cache", key = "{#root.methodName, #aLong}")
  @Override
  Optional<Teacher> findById(Long aLong);

  @Cacheable(value = "Cache", key = "{#root.methodName, #name}")
  Optional<Teacher> findByName(String name);
}

如果在調(diào)用 TeacherDao 中的方法命中了 StudentDao 中的方法會產(chǎn)生 ClassCastException ,這里就兩種方式來解決這個問題。第一種辦法是每個 dao 中都使用不同的緩存名字。第二是給 key 加上類的名字。

我 google 了一下,沒有找到使用 Spel 或取到類名的方法(或許有),所以這里通過配置 @Cacheable 的 key參數(shù)就不行了。那就只能實現(xiàn)自定義的生成器。

@Bean("customKeyGenerator")
public KeyGenerator keyGenerator() {
 return new KeyGenerator() {
  @Override
  public Object generate(Object o, Method method, Object... objects) {
   return method.getDeclaringClass().getName() + "_"
    + method.getName() + "_"
    + StringUtils.arrayToDelimitedString(objects, "_");
  }
 };
}

設(shè)置 @Cacheable 的 keyGenerator 參數(shù)

@Cacheable(value = "Cache", keyGenerator = "customKeyGenerator")
@Override
Optional<Student> findById(Long aLong);

@Cacheable(value = "Cache", keyGenerator = "customKeyGenerator")
Optional<Student> findByName(String name);

查看 Redis 中的 key

127.0.0.1:6379> keys *
1) "Cache::me.action.dao.StudentDao_findById_1"
2) "Cache::me.action.dao.StudentDao_findByName_1"

Key 由緩存名、類名、方法名和參數(shù)構(gòu)成,這樣足夠保險了。在實際開發(fā)中可以根據(jù)實際情況構(gòu)造 key 滿足需求。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例

    java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例

    這篇文章主要介紹了java編程隊列數(shù)據(jù)結(jié)構(gòu)代碼示例,簡單介紹了隊列的相關(guān)基礎(chǔ)知識,然后通過實例向大家展示其實現(xiàn)方法,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Maven2環(huán)境安裝與準(zhǔn)備工作詳解

    Maven2環(huán)境安裝與準(zhǔn)備工作詳解

    這篇文章主要為大家詳細(xì)介紹了Maven2環(huán)境安裝與準(zhǔn)備工作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java排序算法總結(jié)之插入排序

    Java排序算法總結(jié)之插入排序

    這篇文章主要介紹了Java排序算法總結(jié)之插入排序,較為詳細(xì)的分析了插入排序的原理與java實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Spring注解@Transactional失效的場景分析

    Spring注解@Transactional失效的場景分析

    在使用Spring中事務(wù)注解@Transactional時會存在幾種場景下該注解失效,即不能按照預(yù)期封裝成一個事務(wù)操作,于是本文文將對該注解進(jìn)行學(xué)習(xí)并對相關(guān)失效場景進(jìn)行分析,需要的朋友可以參考下
    2023-07-07
  • Java 括號匹配問題案例詳解

    Java 括號匹配問題案例詳解

    這篇文章主要介紹了Java 括號匹配問題案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    這篇文章主要介紹了Spring和SpringMVC父子容器關(guān)系初窺(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    微服務(wù)架構(gòu)中多數(shù)據(jù)源切換是個常見的需求,Spring Boot 提供了強大的支持來簡化這一過程.本文給大家介紹了SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法,需要的朋友可以參考下
    2024-11-11
  • 基于springboot實現(xiàn)整合shiro實現(xiàn)登錄認(rèn)證以及授權(quán)過程解析

    基于springboot實現(xiàn)整合shiro實現(xiàn)登錄認(rèn)證以及授權(quán)過程解析

    這篇文章主要介紹了基于springboot實現(xiàn)整合shiro實現(xiàn)登錄認(rèn)證以及授權(quán)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java源碼跟蹤閱讀技巧【值得收藏】

    Java源碼跟蹤閱讀技巧【值得收藏】

    今天跟大家分享一下我平時閱讀源碼的幾個小技巧,對于閱讀Java中間件如Spring、Dubbo等框架源碼的同學(xué)有一定幫助。本文基于Eclipse IDE,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評論

嘉定区| 西华县| 大洼县| 伊通| 汾西县| 咸宁市| 德钦县| 绥化市| 沂南县| 临武县| 昭平县| 建平县| 东阳市| 武邑县| 分宜县| 唐河县| 永吉县| 乃东县| 雅安市| 高密市| 灵丘县| 永胜县| 靖安县| 莆田市| 嘉黎县| 台山市| 武邑县| 昌乐县| 和硕县| 古田县| 嘉峪关市| 阜新| 翁牛特旗| 上思县| 罗城| 寿宁县| 昌乐县| 建阳市| 陕西省| 阿拉尔市| 济阳县|