精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot中使用Cache提升接口性能詳解

開發 架構
Spring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各種緩存解決方案,并對代碼的影響最小。

環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPA

Spring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各種緩存解決方案,并對代碼的影響最小。從 Spring4.1 版本開始,緩存抽象支持了 JSR-107 注釋和更多自定義選項,從而得到了顯著的改進。

方式1:直接使用spring的注解來實現緩存

spring提供了如下注解:

@Cacheable 觸發緩存機制

@CacheEvict 觸發緩存回收

@CachePut 更新緩存,而不會影響方法的執行

@Caching 組合多個緩存操作到一個方法

@CacheConfig 類級別共享系誒常見的緩存相關配置

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

首先在Service對應的方法是添加注解:

@Service
public class StorageService {
  
  @Resource
  private StorageRepository sr ;
  
  @Cacheable(value = {"cache_storage"}, keyGenerator = "storageKey")
  public Storage getStorage(Long id) {
    return sr.findById(id).get() ;
  }
  
}
// 這里的keyGenerator是你自定義Key生成的Bean名稱
@Component("storageKey")
public class StorageKeyGenerator implements KeyGenerator {


  private static final String  KEY_PREFIX = "storage_" ;
  
  @Override
  public Object generate(Object target, Method method, Object... params) {
    StringBuilder sb = new StringBuilder() ;
    for (Object param : params) {
      sb.append(param) ;
    }
    return KEY_PREFIX + sb.toString() ;
  }


}

web接口:

@RestController
@RequestMapping("/storages")
public class StorageController {
  
  @Resource
  private StorageService storageService ;


  @GetMapping("/{id}")
  public Object get(@PathVariable("id") Long id) {
    return storageService.getStorage(id) ;
  }
}

測試:

第一次訪問接口,查看控制臺輸出了sql語句:

圖片圖片

再次訪問接口,發現控制臺沒有再輸出任何sql,說明我們的緩存生效了(這里你也可以把這里的注解注釋了來看效果)。關于這里的更新緩存,刪除緩存就不演示了。接下來完整的演示下JSR107規范中的注解演示:

注意在這些注釋中我們是可以使用SpEL表達式的:

圖片圖片

方式2:使用JSR107和Ehcache

先來看看Spring與JSR107注解的對照表:

圖片圖片

pom.xml中加入依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.ehcache</groupId>
  <artifactId>ehcache</artifactId>
</dependency>
<dependency>
  <groupId>javax.cache</groupId>
  <artifactId>cache-api</artifactId>
</dependency>

Service類:

@Service
public class StorageService {
  
  @Resource
  private StorageRepository sr ;
  
  // 這里的 @CacheValue 說明是要緩存的參數值。
  @Transactional
  @CachePut(cacheName = "cache_storage", cacheKeyGenerator = JCacheKeyGenerator.class)
  public Storage save(@CacheValue Storage storage) {
    return sr.saveAndFlush(storage) ;
  }
  @CacheResult(cacheName = "cache_storage", cacheKeyGenerator = JCacheKeyGenerator.class)
  public Storage getStorage(Long id) {
    return sr.findById(id).get() ;
  }
  
  @Transactional
  @CacheRemove(cacheName = "cache_storage", cacheKeyGenerator = JCacheKeyGenerator.class)
  public void removeStorage(Long id) {
    sr.deleteById(id) ;
  }
  
  @Transactional
  @CachePut(cacheName = "cache_storage", cacheKeyGenerator = JCacheKeyGenerator.class)
  public Storage updateStorage(@CacheValue Storage storage) {
    return sr.saveAndFlush(storage) ;
  }
}
// 注意這里的cacheKeyGenerator 必須全部用同一個,
// 跟蹤了下源碼是用的對應的類名key來查找對應的緩存的;一開始我沒有用同一個始終不正確。。
// 看下圖跟蹤的代碼:

圖片圖片

這里必須要一樣哦cacheKeyGenerator

緩存Key:JCacheKeyGenerator.java

public class JCacheKeyGenerator implements CacheKeyGenerator {


  private static final String  KEY_PREFIX = "storage_" ;
  
  @Override
  public GeneratedCacheKey generateCacheKey(
      CacheKeyInvocationContext<? extends Annotation> cacheKeyInvocationContext) {
    CacheInvocationParameter[] params = cacheKeyInvocationContext.getAllParameters() ;
    StringBuilder sb = new StringBuilder() ;
    for (CacheInvocationParameter param : params) {
      if (param.getValue() instanceof Storage) {
        Storage s = (Storage) param.getValue() ;
        sb.append(s.getId()) ;
      } else {
        sb.append((Long)param.getValue()) ;
      }
    }
    return new StorageGeneratedCacheKey(KEY_PREFIX + sb.toString()) ;
  }
  
  private static class StorageGeneratedCacheKey implements GeneratedCacheKey {
    private static final long serialVersionUID = 1L;
    
    private String key ;
    
    public StorageGeneratedCacheKey(String key) {
      this.key = key ;
    }


    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((key == null) ? 0 : key.hashCode());
      return result;
    }


    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      StorageGeneratedCacheKey other = (StorageGeneratedCacheKey) obj;
      if (key == null) {
        if (other.key != null)
          return false;
        } else if (!key.equals(other.key))
          return false;
      return true;
      }
    
    }


}

application.yml配置:

spring:
  cache:
    cacheNames:
    - cache_storage
    ehcache:
      config: classpath:ehcache.xml

ehcache.xml

<?xml versinotallow="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">


  <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
   
  <defaultCache eternal="false" maxElementsInMemory="10000"  overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="1800" timeToLiveSeconds="259200" memoryStoreEvictionPolicy="LRU" />


  <cache name="cache_storage" eternal="false" maxElementsInMemory="5000"  overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="1800" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LRU" />
 
</ehcache>

測試增刪改:

先添加個數據:

圖片圖片

圖片圖片

成功添加ID為4的信息,Service中的save方法中我們添加了@CachePut注解,接下來我們查詢ID為4的信息,看看控制臺是否會生成SQL語句。

圖片圖片

圖片圖片

控制臺沒有增加任何的SQL語句,說明save方法加的@CachePut生效了。

接著做刪除操作:

圖片圖片

圖片圖片

ID為4的刪除了,接下來再做查詢看看:

圖片圖片

這說明刪除了數據后,緩存也做了刪除。這里生成了查詢語句。

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2021-09-27 08:16:38

Webpack 前端Cache

2025-06-18 11:16:50

大模型性能KV-Cache

2023-03-30 07:48:46

接口鑒權SpringBoot

2009-08-05 15:13:32

使用Cache提高AS

2020-06-04 16:57:07

移動開發互聯網實踐

2018-06-22 13:45:08

數據庫MySQLtable-cache

2018-10-24 10:45:15

云盤云服務存儲

2011-09-16 10:19:41

2020-11-04 18:13:24

DebianUbuntuapt-cache命令

2022-05-17 08:25:10

TypeScript接口前端

2009-06-05 15:04:36

Eclipse代碼模版

2024-08-01 08:06:11

虛擬線程性能

2023-10-19 13:56:00

Vue項目Mock.js

2020-07-22 08:30:02

代碼開發工具

2023-03-01 15:14:48

數據集機器學習

2023-05-12 13:21:12

JMHJava程序

2017-03-13 09:50:00

HadoopHive

2024-11-06 09:26:48

SpringprofileENV

2011-06-30 10:50:39

Qt OpenCV

2012-04-23 10:30:38

Hadoop
點贊
收藏

51CTO技術棧公眾號

亚洲精品日韩激情在线电影| 亚洲视频在线观看视频| 免费人成自慰网站| 三级理论午夜在线观看| 男女男精品网站| 美日韩丰满少妇在线观看| 色哟哟视频在线| 中文字幕日本一区二区| 亚洲日本护士毛茸茸| 精品国产乱码久久久久久108| 无码人妻丰满熟妇精品| 亚洲国产精品成人| 精品一区二区三区电影| www.51色.com| 中文日产幕无线码一区二区| 亚洲免费观看高清| 欧美一级爽aaaaa大片| 国产黄a三级三级三级| 久久裸体视频| 欧美激情视频一区二区| 成人免费视频入口| 色爱综合av| 欧美一区二区三区免费视频 | 色婷婷国产精品| 欧美 亚洲 视频| 爱爱爱免费视频在线观看| 成人黄色国产精品网站大全在线免费观看| 国产精品igao视频| 日本系列第一页| 亚洲成av人片乱码色午夜| 亚洲三级 欧美三级| 在线播放第一页| 最新亚洲国产| 欧美三级韩国三级日本三斤| 午夜精品久久久内射近拍高清| 污污网站在线看| 亚洲欧洲一区二区在线播放| 日本黑人久久| 五月婷婷开心中文字幕| 国产精品羞羞答答xxdd| 成人福利视频在线观看| 波多野结衣一区二区三区四区| 亚洲青色在线| 久久久亚洲福利精品午夜| 91香蕉视频在线播放| 91久久夜色精品国产按摩| 在线日韩欧美视频| 成熟人妻av无码专区| 免费成人网www| 亚洲跨种族黑人xxx| 香港三日本8a三级少妇三级99| 亚洲啊v在线免费视频| 91精品国产欧美一区二区18| 天天干天天色天天干| 日韩伦理一区二区| 欧美日韩午夜在线视频| 美女网站色免费| 成人一区视频| 欧美久久免费观看| 国产欧美精品一二三| 爱情电影网av一区二区| 欧美一级二级在线观看| 精品人妻一区二区三| 九九久久国产| 欧美一区二区视频在线观看 | 亚洲熟妇无码av在线播放| 色视频在线观看福利| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美一区二区三区视频免费| 久久久久亚洲av无码麻豆| 国产一区二区三区亚洲综合| 欧美一区二区不卡视频| 亚洲免费观看在线| 久久精品色综合| 亚洲欧美另类中文字幕| 久久久久无码精品国产sm果冻| 国际精品欧美精品| 久久精品99国产精品酒店日本 | 天天躁日日躁狠狠躁欧美巨大小说| 亚洲国产精品久久久久| a毛片毛片av永久免费| 欧美色网址大全| 久久久精品在线| 久久久无码精品亚洲国产| 99国产精品自拍| 国产成人一区二区三区小说| 一本色道久久综合熟妇| 国产成人av影院| 久久久综合香蕉尹人综合网| 啊v视频在线| 一区二区三区欧美视频| 黄色一级片播放| 国产成人精选| 精品久久久久久亚洲综合网 | 亚洲摸摸操操av| 全黄性性激高免费视频| 欧美影视资讯| 日韩精品在线看片z| 六月婷婷七月丁香| 国产大片一区| 3344国产精品免费看| 无码人妻一区二区三区线| 韩国视频一区二区| 麻豆成人在线播放| 香蕉久久aⅴ一区二区三区| 色综合久久99| 日本xxxx免费| 精品久久久久久久| 久久久久久久激情视频| 成人午夜免费在线| 国产无遮挡aaa片爽爽| 久久深夜福利| 99久久无色码| 91美女视频在线| 欧美日韩国产在线看| 日韩va在线观看| 免费久久久久久久久| 久久99久久亚洲国产| 国产精品熟女视频| 成人一级黄色片| 偷拍盗摄高潮叫床对白清晰| 三级成人在线| 欧美成人官网二区| 亚洲精品自拍视频在线观看| 国产一区二区三区久久久久久久久| 91亚洲精华国产精华| av国产在线观看| 欧美视频在线观看 亚洲欧| 原创真实夫妻啪啪av| 日韩精品一区二区三区免费观看 | 日韩xxx高潮hd| 国产一区视频导航| 亚洲欧美成人一区| 成人免费网站www网站高清| 日韩精品www| 国产精品成人久久| 国产99久久久久久免费看农村| 一区不卡字幕| 国产精品久久久久久久久免费高清 | 一级黄色片国产| 久久蜜桃av| 国产精品视频在线播放| 川上优的av在线一区二区| 欧美午夜视频一区二区| 在线免费观看污视频| 韩国在线一区| av一区二区三区四区电影| 中文字幕资源网在线观看| 在线不卡中文字幕播放| 国产视频123区| 麻豆国产精品官网| 亚洲精品不卡| 欧美日韩视频免费看| 色老头一区二区三区| 一级黄色片免费| 中文字幕永久在线不卡| 手机免费av片| 中文字幕在线2018| 久久婷婷影院| 欧洲一区二区在线观看| 成人午夜精品| 综合av色偷偷网| 91麻豆成人精品国产| 亚洲天堂免费看| 丰满人妻一区二区三区53视频| 欧美精品一卡| 国产视频精品网| 岛国av在线网站| 日韩精品视频在线观看免费| 无码人妻精品一区二| 国产精品三级视频| 免费国偷自产拍精品视频| 海角社区69精品视频| 久久久久欧美| 91大神在线观看线路一区| 久久精品最新地址| 黑人精品一区二区| 色噜噜狠狠色综合欧洲selulu| 成熟人妻av无码专区| 四季久久免费一区二区三区四区| 成人国产精品视频| 黑森林福利视频导航| 99精品在线观看| 国产激情一区二区三区在线观看| 在线视频cao| 日韩在线观看av| 欧洲精品久久一区二区| 在线观看国产日韩| 亚洲国产精品免费在线观看| 久久综合色之久久综合| 黄色一级片免费的| 亚洲茄子视频| 一本色道久久综合亚洲精品婷婷 | 精品一区二区三区视频| www.av毛片| 超碰成人久久| 国产精品国产精品国产专区不卡| 在线观看欧美日韩电影| 久久精品视频在线播放| 亚洲欧洲国产综合| 欧美一区二区三区日韩| 91porny九色| 亚洲国产成人av| 婷婷国产成人精品视频| 久久众筹精品私拍模特| 国内精品国产三级国产aⅴ久| 午夜亚洲性色视频| 国产精品8888| 日韩激情在线| 久久riav二区三区| 激情久久免费视频| 国产精品白嫩初高中害羞小美女| 欧美aaaaaaa| www.欧美精品| 国产在线视频福利| 亚洲成色999久久网站| 国产精品视频在线观看免费 | 国产乱叫456在线| 色一情一乱一乱一91av| 久久久精品国产sm调教| 自拍av一区二区三区| 亚欧洲乱码视频| www.亚洲精品| 伊人影院在线观看视频| 国产精品免费一区豆花| 黄色a在线观看| 欧美男女性生活在线直播观看| 四虎成人在线观看| 亚洲成人综合在线| 欧美黑吊大战白妞| 中文字幕亚洲成人| 久久久久久成人网| 国产亚洲精品7777| 一女三黑人理论片在线| 国产91精品露脸国语对白| 捷克做爰xxxⅹ性视频| 毛片av一区二区| 污版视频在线观看| 日韩经典一区二区| 欧美日韩在线不卡视频| 亚洲免费综合| 精品少妇一区二区三区在线| 亚洲国内自拍| 丰满的少妇愉情hd高清果冻传媒| 在线观看日韩| 伊人天天久久大香线蕉av色| 日韩成人a**站| 视频一区视频二区视频| 欧美一级精品| 亚洲欧美国产不卡| 99久久综合| 五月天激情图片| 欧美午夜不卡| 每日在线观看av| 一区二区三区国产盗摄| 九色在线视频观看| 亚洲欧美久久久| 欧美黄网站在线观看| 久久精品成人| 无码人妻精品一区二区三区66| 日欧美一区二区| 中文字幕永久有效| 精品写真视频在线观看| 日本人dh亚洲人ⅹxx| 成年人网站91| 久久成人激情视频| 国产精品久久久久7777按摩| 欧美成人777| 亚洲 欧美综合在线网络| 日韩精品手机在线| 欧美写真视频网站| 99久久一区二区| 亚洲国产成人精品女人久久久| 色久视频在线播放| 色阁综合伊人av| 在线中文字幕电影| 欧美怡红院视频一区二区三区| 四虎成人在线| 成人动漫在线观看视频| 日韩av中文字幕一区| 欧美日韩色婷婷| 国产91在线免费| 蜜桃伊人久久| 色国产在线视频| 成人午夜激情在线| 中文字幕在线观看免费高清| 亚洲嫩草精品久久| 国产农村妇女aaaaa视频| 欧美日韩电影在线播放| 日本人妻丰满熟妇久久久久久| 亚洲天天在线日亚洲洲精| 97超碰在线公开在线看免费| 青青草原一区二区| 99综合久久| 欧美日韩国产不卡在线看| 亚洲澳门在线| 99福利在线观看| 国产精品小仙女| 波多野吉衣中文字幕| 亚洲精品综合在线| 亚洲av无码不卡| 精品国产一区二区精华| 尤物在线视频| 欧美亚洲在线播放| 精品一区二区三区视频在线播放| 麻豆av一区二区三区| 欧美不卡高清| 九九热免费精品视频| 成人听书哪个软件好| 久久一级免费视频| 色哟哟亚洲精品| 人人妻人人澡人人爽人人欧美一区 | 欧美精品 - 色网| 国产亚洲欧美日韩在线一区| 精品视频一区二区在线观看| 欧美日韩一区二区欧美激情| 天天插天天干天天操| 欧美成人免费在线观看| 久久er热在这里只有精品66| 久久久影院一区二区三区| 欧美三区视频| 亚洲免费黄色录像| 国产午夜精品美女毛片视频| 日本中文字幕免费观看| 欧美一区二区免费视频| www.久久热.com| 欧洲精品毛片网站| 日韩福利视频一区| 国产免费黄色一级片| 国产一区免费电影| xxxxx99| 欧美在线观看你懂的| 久久国产精品高清一区二区三区| 91精品国产亚洲| av不卡一区| 国产freexxxx性播放麻豆 | 99在线观看视频| 91精品国产视频| 天天操狠狠操夜夜操| 国产精品久久久久aaaa| 91久久精品国产91性色69| 在线播放国产一区二区三区| 久久91导航| 日韩在线观看电影完整版高清免费| 国产香蕉久久| 亚洲香蕉成人av网站在线观看| 牛牛精品一区二区| 国内视频一区| 亚久久调教视频| 国产肥白大熟妇bbbb视频| 日本精品一区二区三区高清| 国产女人在线视频| 国产精品入口夜色视频大尺度| 日韩精品首页| 亚洲怡红院在线| 亚洲综合免费观看高清完整版在线| 性欧美一区二区三区| 欧美激情xxxxx| 伊人精品一区| 国产又大又黄又猛| 亚洲免费观看在线观看| 成人午夜免费福利| 2021国产精品视频| 精品视频免费| 超碰中文字幕在线观看| 亚洲一卡二卡三卡四卡无卡久久| 亚洲av少妇一区二区在线观看 | 伊人网在线播放| 手机成人在线| 国产精品一区一区| 黑人一级大毛片| 这里只有视频精品| 一级毛片精品毛片| 777久久久精品一区二区三区| 国产人妖乱国产精品人妖| 国产av一区二区三区| 国产91成人video| 久久一区二区三区喷水| 麻豆tv在线观看| 日本高清不卡一区| 在线中文字幕电影| 欧美日韩在线播放一区二区| 久草中文综合在线| 久久久久久国产精品免费播放| 日韩乱码在线视频| 一区在线不卡| 欧美v在线观看| 亚洲男人的天堂在线观看| 日本中文字幕一区二区有码在线| 成人xxxxx| 麻豆精品网站| 国产十六处破外女视频| 精品中文视频在线| 高清不卡一区| 日本黄网站色大片免费观看| 99精品欧美一区二区蜜桃免费 | 日韩久久精品一区| 唐人社导航福利精品| 日本一本草久p| 国产亚洲精品免费|