日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-08-05 11:44:47 5205觀看
導讀環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各種緩存解決方案,并對代碼的影響最小。從 Spri

環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPALrK28資訊網——每日最新資訊28at.com

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

方式1:直接使用spring的注解來實現緩存LrK28資訊網——每日最新資訊28at.com

spring提供了如下注解:LrK28資訊網——每日最新資訊28at.com

@Cacheable 觸發緩存機制LrK28資訊網——每日最新資訊28at.com

@CacheEvict 觸發緩存回收LrK28資訊網——每日最新資訊28at.com

@CachePut 更新緩存,而不會影響方法的執行LrK28資訊網——每日最新資訊28at.com

@Caching 組合多個緩存操作到一個方法LrK28資訊網——每日最新資訊28at.com

@CacheConfig 類級別共享系誒常見的緩存相關配置LrK28資訊網——每日最新資訊28at.com

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

首先在Service對應的方法是添加注解:LrK28資訊網——每日最新資訊28at.com

@Servicepublic 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接口:LrK28資訊網——每日最新資訊28at.com

@RestController@RequestMapping("/storages")public class StorageController {    @Resource  private StorageService storageService ;  @GetMapping("/{id}")  public Object get(@PathVariable("id") Long id) {    return storageService.getStorage(id) ;  }}

測試:LrK28資訊網——每日最新資訊28at.com

第一次訪問接口,查看控制臺輸出了sql語句:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

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

注意在這些注釋中我們是可以使用SpEL表達式的:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

方式2:使用JSR107和EhcacheLrK28資訊網——每日最新資訊28at.com

先來看看Spring與JSR107注解的對照表:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

pom.xml中加入依賴:LrK28資訊網——每日最新資訊28at.com

<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類:LrK28資訊網——每日最新資訊28at.com

@Servicepublic 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來查找對應的緩存的;一開始我沒有用同一個始終不正確。。// 看下圖跟蹤的代碼:

圖片圖片LrK28資訊網——每日最新資訊28at.com

這里必須要一樣哦cacheKeyGeneratorLrK28資訊網——每日最新資訊28at.com

緩存Key:JCacheKeyGenerator.javaLrK28資訊網——每日最新資訊28at.com

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配置:LrK28資訊網——每日最新資訊28at.com

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

ehcache.xmlLrK28資訊網——每日最新資訊28at.com

<?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>

測試增刪改:LrK28資訊網——每日最新資訊28at.com

先添加個數據:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

成功添加ID為4的信息,Service中的save方法中我們添加了@CachePut注解,接下來我們查詢ID為4的信息,看看控制臺是否會生成SQL語句。LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

控制臺沒有增加任何的SQL語句,說明save方法加的@CachePut生效了。LrK28資訊網——每日最新資訊28at.com

接著做刪除操作:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

LrK28資訊網——每日最新資訊28at.com

ID為4的刪除了,接下來再做查詢看看:LrK28資訊網——每日最新資訊28at.com

圖片圖片LrK28資訊網——每日最新資訊28at.com

LrK28資訊網——每日最新資訊28at.com

這說明刪除了數據后,緩存也做了刪除。這里生成了查詢語句。LrK28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-89-0.htmlSpringBoot中使用Cache提升接口性能詳解

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: K8S | Service服務發現

下一篇: 一年經驗在二線城市面試后端的經驗分享

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲精品欧洲精品| 国产精品久久久一区麻豆最新章节 | 美女国产一区| 欧美国产日韩精品免费观看| 欧美精品乱人伦久久久久久| 欧美视频在线不卡| 国产日韩欧美日韩| 亚洲国产精品日韩| 亚洲视频福利| 久久精品成人一区二区三区蜜臀 | 在线精品国产成人综合| 亚洲精品亚洲人成人网| 亚洲综合99| 久久久噜噜噜久久久| 欧美噜噜久久久xxx| 国产精品尤物| 亚洲国产欧美一区二区三区同亚洲| 夜夜嗨一区二区三区| 国产精品久久网站| 国产情侣久久| 亚洲品质自拍| 性做久久久久久免费观看欧美| 久久一区亚洲| 欧美午夜无遮挡| 黄色综合网站| 一区二区三区四区国产| 欧美一区成人| 欧美激情精品久久久六区热门 | 亚洲欧美日韩综合aⅴ视频| 久久综合久久综合九色| 欧美午夜电影一区| 尤物99国产成人精品视频| 在线亚洲精品福利网址导航| 久久久亚洲影院你懂的| 欧美体内she精视频| 一色屋精品视频免费看| 亚洲午夜精品久久久久久浪潮| 久久亚洲不卡| 国产乱肥老妇国产一区二| 91久久精品一区| 久久国产日韩欧美| 国产精品videosex极品| 亚洲黄一区二区三区| 欧美影院久久久| 欧美日韩在线播放一区| 亚洲高清二区| 久久精品成人| 国产精品蜜臀在线观看| 亚洲美女视频在线免费观看| 久久久久久久久久码影片| 国产精品久久久久久户外露出| 亚洲国产欧美一区二区三区久久| 欧美一区二视频在线免费观看| 欧美日韩在线一区| 亚洲精品日本| 欧美深夜福利| 在线看一区二区| aa成人免费视频| 牛夜精品久久久久久久99黑人 | 国产精品一区二区久激情瑜伽| 怡红院精品视频| 欧美一二三区在线观看| 欧美国产日韩一区二区| 黄色精品在线看| 午夜一区不卡| 国产精品日韩久久久| 一区二区欧美在线| 欧美激情一区在线| 亚洲电影免费观看高清完整版| 久久本道综合色狠狠五月| 国产精品久久久久毛片大屁完整版| 亚洲免费观看在线观看| 欧美丰满高潮xxxx喷水动漫| 亚洲电影观看| 美女日韩在线中文字幕| 精品动漫3d一区二区三区免费版 | 亚洲视频高清| 亚洲一二三四久久| 欧美精品 日韩| 亚洲国产小视频| 欧美在线观看一二区| 国产精品麻豆欧美日韩ww| 亚洲靠逼com| 亚洲欧美日韩系列| 欧美网站在线观看| 亚洲人成网在线播放| 久久香蕉国产线看观看av| 狠狠色丁香久久综合频道| 欧美在线观看天堂一区二区三区| 国产精品日本精品| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久 | 欧美日韩在线播放| 99热在这里有精品免费| 欧美国产视频一区二区| 亚洲精品一区二区三区不| 欧美日本免费| 亚洲精品久久久久久一区二区| 欧美精品激情| 一本色道久久综合亚洲精品不卡| 欧美日韩精品久久| 亚洲调教视频在线观看| 国产精品久久久久久久久免费| 亚洲在线观看免费视频| 国产欧美日韩在线| 久久精品免费电影| 亚洲第一成人在线| 欧美美女视频| 亚洲天堂男人| 国产日韩精品一区二区浪潮av| 欧美中文在线视频| 在线播放国产一区中文字幕剧情欧美 | 国产精品久久久久久av下载红粉 | 亚洲欧美国产高清| 国产亚洲精品一区二555| 久久亚洲影院| 亚洲精品美女| 国产精品二区三区四区| 欧美亚洲在线| 亚洲第一伊人| 欧美特黄一级| 久久不射电影网| 亚洲黑丝在线| 国产精品v日韩精品| 欧美一区二区大片| 在线日韩一区二区| 欧美日韩综合另类| 久久成人一区| 亚洲精品一级| 国产精品一区在线观看你懂的| 久久精品亚洲精品| 日韩午夜一区| 国产亚洲精品久久久久动| 牛牛精品成人免费视频| 中日韩午夜理伦电影免费| 国产无一区二区| 欧美精品麻豆| 欧美在线一二三区| 亚洲精品日产精品乱码不卡| 国产精品久久久久天堂| 久久久国产精品一区二区中文| 亚洲理论电影网| 国产午夜一区二区三区| 欧美激情成人在线视频| 午夜精品久久久久久 | 亚洲午夜精品福利| 精品成人乱色一区二区| 欧美日韩一区二区在线播放| 久久精品综合网| 一本色道久久综合一区| 激情综合自拍| 国产精品福利片| 免费在线视频一区| 午夜精品影院在线观看| 亚洲日产国产精品| 国产综合色在线视频区| 欧美日韩一区二区精品| 裸体一区二区| 欧美一级视频| 亚洲视频电影在线| 亚洲国产日韩在线| 国产中文一区二区三区| 欧美日在线观看| 免费视频一区二区三区在线观看| 亚洲欧美国产毛片在线| 亚洲乱码精品一二三四区日韩在线| 国产亚洲一区在线| 欧美午夜在线| 欧美大片免费看| 久久久久久高潮国产精品视| 亚洲一区欧美二区| 亚洲人被黑人高潮完整版| 国产午夜精品全部视频播放| 欧美日韩在线直播| 欧美国产第二页| 久久久噜噜噜久久中文字幕色伊伊| 亚洲激情在线| 在线观看91精品国产麻豆| 国产女人aaa级久久久级| 欧美色综合天天久久综合精品| 久久婷婷av| 久久国产99| 欧美一区二区播放| 午夜精品久久久久久久99樱桃 | 欧美高清在线一区二区| 久久嫩草精品久久久精品| 羞羞视频在线观看欧美| 亚洲一区欧美激情| 在线中文字幕一区| 一区二区精品| 一本色道久久99精品综合| 亚洲精品久久久久久下一站| 亚洲福利免费| 136国产福利精品导航网址| 韩国一区电影| 欧美一区二区三区四区夜夜大片| 在线性视频日韩欧美| 亚洲美女在线视频| 亚洲日本免费| 亚洲乱码国产乱码精品精可以看| 亚洲第一成人在线| 亚洲国产高清自拍| 亚洲国产日韩欧美在线图片| 在线观看视频一区二区| 在线成人免费视频|