91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring boot redis cache的key怎么用

發布時間:2021-08-09 11:18:39 來源:億速云 閱讀:184 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Spring boot redis cache的key怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

在數據庫查詢中我們往往會使用增加緩存來提高程序的性能,@Cacheable 可以方便的對數據庫查詢方法加緩存。

搭建項目

數據庫

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

數據訪問層

public interface StudentDao extends CrudRepository<Student, Long> {

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

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

啟動調用數據訪問層方法觀察

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

當默認使用 @Cacheable(value = "Cache") 的時候查看 redis 中緩存的 key

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

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

@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);
}
//輸出結果
//Optional[Student(id=1, name=Simone, gradeClass=3-2)]
//Optional[Student(id=1, name=Simone, gradeClass=3-2)]

從數據庫的數據看 studentDao.findByName("1") 應該是查詢出空的,但是取命中了緩存,所以我們需要給緩存的 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,很有可能產生相同的 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);
}

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

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

@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, "_");
  }
 };
}

設置 @Cacheable 的 keyGenerator 參數

@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 由緩存名、類名、方法名和參數構成,這樣足夠保險了。在實際開發中可以根據實際情況構造 key 滿足需求。

關于“Spring boot redis cache的key怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沾益县| 黄梅县| 崇文区| 舒兰市| 巴林左旗| 平谷区| 通山县| 寿光市| 璧山县| 黎川县| 永安市| 哈密市| 奉节县| 房山区| 郸城县| 凤庆县| 磴口县| 金乡县| 九台市| 临朐县| 灵川县| 轮台县| 衡水市| 湖州市| 如东县| 洪洞县| 景宁| 朔州市| 杂多县| 甘孜| 建水县| 华宁县| 乌鲁木齐市| 金平| 马尔康县| 温宿县| 兰考县| 庆安县| 镇原县| 陆川县| 大宁县|