激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java Spring-Cache key配置注意事項介紹

Java Spring-Cache key配置注意事項介紹

2021-01-20 13:58liuyazhuang Java教程

本文主要對java spring-cache key配置注意事項進行了介紹,小編覺得還是挺不錯的,這里分享給大家,供需要的朋友參考。

為了提升項目的并發性能,考慮引入本地內存Cache,對:外部數據源訪問、Restful API調用、可重用的復雜計算 等3種類型的函數處理結果進行緩存。目前采用的是spring Cache的@Cacheable注解方式,緩存具體實現選取的是Guava Cache。
具體緩存的配置此處不再介紹,重點對于key的配置進行說明:

1、基本形式

?
1
2
@Cacheable(value="cacheName", key"#id"
public ResultDTO method(int id);

2、組合形式

?
1
2
@Cacheable(value="cacheName", key"T(String).valueOf(#name).concat('-').concat(#password)) 
public ResultDTO method(int name, String password);

3、對象形式

?
1
2
@Cacheable(value="cacheName", key"#user.id)
public ResultDTO method(User user);

4、自定義key生成器

?
1
2
@Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator")
public ResultDTO method(User user);

注意:Spring默認的SimpleKeyGenerator是不會將函數名組合進key中的

如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class CacheTestImpl implements CacheTest {
  @Cacheable("databaseCache")
  public Long test1()
  { return 1L; }
  @Cacheable("databaseCache")
  public Long test2()
  { return 2L; }
  @Cacheable("databaseCache")
  public Long test3()
  { return 3L; }
  @Cacheable("databaseCache")
  public String test4()
  { return "4"; }
}

我們期望輸出:

?
1
2
3
4
1
2
3
4

實際卻輸出:

?
1
2
3
4
1
1
1
ClassCastException: java.lang.Long cannot be cast to java.lang.String

此外,原子類型的數組,直接作為key使用也是不會生效的

為了解決上述2個問題,自定義了一個KeyGenerator如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class CacheKeyGenerator implements KeyGenerator {
  // custom cache key
  public static final int NO_PARAM_KEY = 0;
  public static final int NULL_PARAM_KEY = 53;
  @Override
  public Object generate(Object target, Method method, Object... params) {
    StringBuilder key = new StringBuilder();
    key.append(target.getClass().getSimpleName()).append(".").append(method.getName()).append(":");
    if (params.length == 0) {
      return key.append(NO_PARAM_KEY).toString();
    }
    for (Object param : params) {
      if (param == null) {
        log.warn("input null param for Spring cache, use default key={}", NULL_PARAM_KEY);
        key.append(NULL_PARAM_KEY);
      } else if (ClassUtils.isPrimitiveArray(param.getClass())) {
        int length = Array.getLength(param);
        for (int i = 0; i < length; i++) {
          key.append(Array.get(param, i));
          key.append(',');
        }
      } else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) {
        key.append(param);
      } else {
        log.warn("Using an object as a cache key may lead to unexpected results. " +
            "Either use @Cacheable(key=..) or implement CacheKey. Method is " + target.getClass() + "#" + method.getName());
        key.append(param.hashCode());
      }
      key.append('-');
    }
    String finalKey = key.toString();
    long cacheKeyHash = Hashing.murmur3_128().hashString(finalKey, Charset.defaultCharset()).asLong();
    log.debug("using cache key={} hashCode={}", finalKey, cacheKeyHash);
    return key.toString();
  }
}

采用此方式后可以解決:多參數、原子類型數組、方法名識別 等問題

總結

以上就是本文關于Java Spring-Cache key配置注意事項介紹的全部內容如有不足之處,歡迎留言指出,小編會及時回復大家并修正,給廣大編程愛好者提供更好的閱讀體驗,希望對大家有所幫助。在此也非常希望朋友們對本站多多支持!

原文鏈接:http://blog.csdn.net/l1028386804/article/details/70946410

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美性色黄大片www 操碰网 | 中文字幕在线亚洲 | 免费观看的毛片手机视频 | 欧美三级欧美成人高清www | av在线免费观看不卡 | 麻豆国产一区 | 精品国产一区二区三区四区在线 | 黄色片在线观看网站 | 92自拍视频| 免费一级特黄欧美大片勹久久网 | 黄色特级片黄色特级片 | 91短视频在线播放 | 欧美视频在线一区二区三区 | 毛片网站网址 | 万圣街在线观看免费完整版 | 黄片毛片一级 | 欧美一级淫片免费视频1 | 在线观看中文字幕国产 | 娇妻被各种姿势c到高潮小说 | 亚欧在线免费观看 | 午色影院| 成人在线观看免费观看 | 性欧美一区 | 4399一级成人毛片 | 麻豆国产网站 | 日韩黄站 | 久久综合九色 | 国产精品999在线观看 | 电影av在线 | 日韩精品中文字幕一区二区三区 | 欧美18—19sex性hd按摩 | 青青操精品 | 毛片久久 | 中文字幕在线观看成人 | 精品在线视频观看 | 成人性生活视频 | 奇米影视奇米色777欧美 | 伊人yinren22综合网色 | 污污的视频在线观看 | 日本人乱人乱亲乱色视频观看 | 久久久久久久免费看 |