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

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

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

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

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

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

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

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

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

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

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

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

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

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

首先在Service對應的方法是添加注解:RkK28資訊網——每日最新資訊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接口:RkK28資訊網——每日最新資訊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) ;  }}

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

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

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

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

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

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

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

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

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

pom.xml中加入依賴:RkK28資訊網——每日最新資訊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類:RkK28資訊網——每日最新資訊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來查找對應的緩存的;一開始我沒有用同一個始終不正確。。// 看下圖跟蹤的代碼:

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

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

緩存Key:JCacheKeyGenerator.javaRkK28資訊網——每日最新資訊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配置:RkK28資訊網——每日最新資訊28at.com

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

ehcache.xmlRkK28資訊網——每日最新資訊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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上一篇: K8S | Service服務發現

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

標簽:
  • 熱門焦點
  • 6月iOS設備性能榜:M2穩居榜首 A系列只能等一手3nm來救

    沒有新品發布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發布節奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 東方甄選單飛:有些鳥注定是關不住的

    作者:彭寬鴻來源:華爾街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
Top 主站蜘蛛池模板: 墨江| 全州县| 安图县| 明水县| 黔西县| 诸暨市| 洮南市| 金坛市| 石景山区| 策勒县| 英山县| 双鸭山市| 神木县| 安泽县| 福鼎市| 湖南省| 白玉县| 额敏县| 伊通| 辉南县| 青冈县| 姜堰市| 微山县| 平泉县| 泗洪县| 林口县| 沈阳市| 瑞安市| 灵寿县| 深州市| 海丰县| 平顶山市| 南安市| 于田县| 含山县| 军事| 海丰县| 观塘区| 长葛市| 富蕴县| 浑源县|