Ehcache 筆記

前言

說道緩存,大家想到的是一定是Redis,確實在國內Redis被大量應用,推上了新的高度!但是不一定所有的場合都要使用Redis,例如服務器資源緊缺,集成不方便的時候就可以考慮使用本地緩存

簡介

緩存應該是每個系統都要考慮的架構,緩存不僅可以加速系統的訪問速度還可以提升系統的性能。如我們需要經常訪問的高頻熱點數據,如果把它緩存起來就能有效減少數據庫服務器的壓力。手機驗證碼等有一定的失效時間,我們就可以考慮使用緩存,等失效時間過了,就刪掉驗證碼。因此市面上緩存組件也層出不進,常見的有

  • JCache:Java緩存API。由JSR107定義,定義了5個核心接口,分別是CachingProvider,CacheManager,Cache,Entry和Expriy
  • EhCache:純Java的進程內緩存框架,jvm虛擬機中緩存、速度快,效率高,是Hibernate中默認的CacheProvider,但是共享緩存與集群分布式應用整合不方便
  • Redis:生態完善,通過socket訪問緩存服務,效率上是比EhCache低的,但是在集群模式、分布式應用上就比較成熟,是大型應用首先中間件
  • Caffeine:Caffeine是使用Java8對Guava緩存的重寫版本,有人稱它為緩存之王

優點

  1. 快速
  2. 簡單
  3. 多種緩存策略(設置有效期等)
  4. 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
  5. 緩存數據會在虛擬機重啟的過程中寫入磁盤
  6. 可以通過RMI、可插入API等方式進行分布式緩存
  7. 具有緩存和緩存管理器的偵聽接口
  8. 支持多緩存管理器實例,以及一個實例的多個緩存區域
  9. 提供Hibernate的緩存實現

jar

<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.10.6</version>
</dependency>

本質

就是簡單看下SpringBoot關于緩存處理源碼是怎么寫的。說到底就是上面所說AOP思想,通過動態代理實現,目標方法讓代理對象去調用,調用之前先看下緩存有沒有,如果有,則從緩存上獲取結果并直接返回。如果緩存中沒有則執行目標方法,并把方法執行結果緩存。
CacheManager->Cache->Element

Ehcache.xml

默認會加載calsspath下的ehcache.xml,加載失敗會加載Ehcache.jar下的ehcache-failsafe.xml

<cache name="account"eternal="false"diskPersistent="false"maxElementsInMemory="10000"timeToIdleSeconds="120"timeToLiveSeconds="120"memoryStoreEvictionPolicy="LRU"></cache><cache name="smsCache"eternal="false"diskPersistent="false"maxElementsInMemory="1000"timeToIdleSeconds="60"timeToLiveSeconds="600"memoryStoreEvictionPolicy="LRU"></cache><!--
name                            緩存名稱
eternal                         true表示對象永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認為false
timeToIdleSeconds               設定允許對象處于空閑狀態的最長時間,以秒為單位。當對象自從最近一次被訪問后,如果處于空閑狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處于空閑狀態
timeToLiveSeconds               設定對象允許存在于緩存中的最長時間,以秒為單位。當對象自從被存放到緩存中后,如果處于緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期,EHCache將把它從緩存中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在于緩存中。timeToLiveSeconds必須大于timeToIdleSeconds屬性,才有意義
maxElementsInMemory             內存中最大緩存對象數;maxElementsInMemory界限后,會把溢出的對象寫到硬盤緩存中。注意:如果緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行
memoryStoreEvictionPolicy       當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)
maxElementsOnDisk               硬盤中最大緩存對象數,若是0表示無窮大
overflowToDisk                  是否保存到磁盤,當系統宕機時
diskPersistent                  是否緩存虛擬機重啟期數據,是否持久化磁盤緩存,當這個屬性的值為true時,系統在初始化時會在磁盤中查找文件名為cache名稱,后綴名為index的文件,這個文件中存放了已經持久化在磁盤中的cache的index,找到后會把cache加載到內存,要想把cache真正持久化到磁盤,寫程序時注意執行net.sf.ehcache.Cache.put(Element element)后要調用flush()方法
diskSpoolBufferSizeMB           這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該有自己的一個緩沖區
diskExpiryThreadIntervalSeconds 磁盤失效線程運行時間間隔,默認為120秒
clearOnFlush                    內存數量最大時是否清除
-->

策略

Ehcache 提供了多種緩存策略,可以根據實際需求選擇合適的策略。其中,最常用的包括:

  • LRU(Least Recently Used):移除最近最少使用的緩存項。(時間)
  • LFU(Least Frequently Used):移除最不經常使用的緩存項。(次數)
  • FIFO(First In, First Out):先進先出,即移除最早加入的緩存項。
  • TTL(Time To Live):根據緩存項的過期時間來判斷是否要移除該項。
    隨機替換:隨機選擇一項進行移除。

緩存注解-自動

JCache(JSR-107)的注解去大大簡化我們的開發。

相關注解和概念說明
Cache緩存接口,定義緩存操作。實現有:RedistCache、EhCacheCache、ConcurrentMapCache等
CacheManager緩存管理器,管理各種緩存(Cache)組件
@Cacheable主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存
@CacheEvict清空緩存
@CachePut保證方法被調用,又希望結果被緩存
@EnableCaching開啟基于注解的緩存
keyGenerator緩存數據時key生成策略
serialize緩存數據時value序列化策略

JSR-107緩存注解使用

光知道SpringBoot集成Ehcache還不夠,我們還要知道怎么使用。然而ehcache在實際應用中可以抽離出來單獨使用,但是需要自己手動實例化與put數據,一般不推薦。推薦配合JSR-107緩存注解去使用(因為Spring都給我們封裝好了),Spring的緩存功能豐富,它還提供了很多注解,去完成不同的場景~其中使用最多的是@Cacheable注解。

@Cacheable (使用最多)
/* 
@Cacheable幾個屬性:1.cacheNames/value:緩存組件的名字 2.key:指定緩存數據使用的key,默認使用方法參數的值,可以編寫SpEL進行指定,如#id就是參數的值3.keyGenerator:key的生成器,可以自己指定key的生成器的組件id,使用時key/keyGenerator只能二選一4.cacheManager:指定緩存管理器,或者cacheResolver指定獲取解析器5.condition:指定復合條件的情況下才緩存,如condition = "#id > 0"6.unless:否定緩存,當unless指定的條件為true,方法的返回值就不會被緩存,如 unless = "#result == null"7.sync:是否啟用異步模式,如果啟用unless就不支持了。默認為false8.緩存的值就是方法返回的結果
*/
// 使用示例@Override@Cacheable(value = "account",key = "#id")public Account getAccountById(int id) {final Account account = accountDao.selectById(id);return Objects.requireNonNull(account);}
@CachePut

即調用方法,又更新緩存數據。如修改了某個數據庫的某個數據,同時更新緩存
執行過程:

  1. 先調用目標方法
  2. 將目標方法的結果緩存起來
    value:命名空間
    key: 主鍵
    @CachePut(value = "account",key = "#id")public Account getAccountById(int id) {final Account account = accountDao.selectById(id);return Objects.requireNonNull(account);}
@CacheEvict

緩存清除,一般在刪除數據方法中使用

    @CacheEvict(value = "account",key = "#id")public boolean deleteAccountById(int id) {return accountDao.deleteById(id) > 0;}

CacheManager-手動

getCache
put
get
remove

 @Autowiredprivate CacheManager cacheManager;@Overridepublic String sendSms(String phoneNumber) {final String uuid = UUID.randomUUID().toString().substring(0, 4);cacheManager.getCache("smsCache").put(new Element(phoneNumber, uuid));return uuid;}@Overridepublic boolean checkSms(String phoneNumber, String code) {final Cache smsCache = cacheManager.getCache("smsCache");smsCache.final Element element = smsCache.get(phoneNumber);final String smscode = (String) element.getObjectValue();return code.equals(smscode);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20067.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

禪道的原理及應用詳解(三)

本系列文章簡介&#xff1a; 在快速發展的軟件開發和項目管理領域中&#xff0c;尋找一款高效、實用且易于上手的項目管理工具是每個團隊都面臨的挑戰。禪道&#xff0c;作為一款國產開源的項目管理軟件&#xff0c;憑借其獨特的管理理念、豐富的功能和友好的用戶體驗&#xff…

翻譯《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)

What a drag: Dragging a virtual file (HGLOBAL edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080318-00/?p23083 Raymond Chen 2008年03月18日 拖拽虛擬文件&#xff08;HGLOBAL 版本&#xff09; 現在我們已經對簡單的數據…

數據庫(13)——DQL分組查詢

語法 SELECT 字段列表 FROM 表名 [WHERE 條件] GROUP BY 分組字段名 [HAVING 分組后過濾條件] 示例 原始表&#xff1a; 根據性別分組并統計人數 select sex,count(*) from information group by sex; 根據性別分組&#xff0c;并求年齡的平均值&#xff1a;

vue iframe src規則

iframe 元素的 src 屬性規則與常規的網頁鏈接規則相似&#xff0c;可以是以下幾種形式&#xff1a; 1、相對路徑&#xff1a;相對于當前頁面的路徑。例如&#xff0c;如果你想加載當前域名下的一個頁面&#xff0c;可以簡單地指定其相對路徑&#xff1a; <iframe src"…

工廠數字化!數據治理是基礎

數據治理是基礎 在當今的工業生產中&#xff0c;數字化轉型已成為企業提升競爭力的必由之路。然而&#xff0c;數字化轉型并非一蹴而就&#xff0c;它需要戰略驅動、數據治理和數據智能的協同發展。本文將圍繞如何進行數字化、數據治理的內涵以及數據治理作為數字化轉型基礎的原…

QT系列教程(7) QLineEdit介紹

簡介 QLineEdit屬于輸入插件&#xff0c;用來實現單行錄入。支持幾種錄入模式。 Normal表示正常錄入,錄入的信息會顯示在QLineEdit上。 Password表示密碼錄入的方式&#xff0c;錄入的信息不顯示QLineEdit&#xff0c;只是通過黑色圓點顯示。 NoEcho 表示不顯示錄入信息&am…

通過SpringCloudGateway中的GlobalFilter實現鑒權過濾

1.pom.xml中加入gateway jar包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency> 2.創建權限過濾器 SecurityFilter /*** 鑒權過濾***/ Slf4j Component …

第 11 章 排序

第 11 章 排序 Abstract 排序猶如一把將混亂變為秩序的魔法鑰匙&#xff0c;使我們能以更高效的方式理解與處理數據。 無論是簡單的升序&#xff0c;還是復雜的分類排列&#xff0c;排序都向我們展示了數據的和諧美感。 本章內容 11.1 排序算法11.2 選擇排序11.3 冒…

Ps:調整畫筆工具

調整畫筆工具 Adjustment Brush Tool可以將選區、創建蒙版和應用調整的傳統工作流程合并為一個步驟&#xff0c;簡化了對圖像進行非破壞性局部調整的操作。 快捷鍵&#xff1a;B 調整畫筆工具是 Photoshop 2024 年 5 月版&#xff08;25.9 版&#xff09;新增的工具。 ◆ ◆ …

【STM32】定時器與PWM的LED控制

目錄 一、定時器控制LED周期性亮滅&#xff08;一&#xff09;定時器1.STM32F103定時器分類及區別2.通用定時器主要功能3.通用定時器工作過程 &#xff08;二&#xff09;STM32CubeMX創建工程&#xff08;三&#xff09;代碼實現&#xff08;四&#xff09;實驗結果 二、PWM模式…

gin接收圖片文件,websocet持續返回響應,解決多任務排隊問題

背景 有一個需求是這樣的&#xff0c;前端需要通過http請求的form-data上傳圖片文件&#xff0c;后端接收圖片后調用AI接口執行命令&#xff0c;由于命令執行時間較長&#xff0c;需要持續返回當前任務在全局任務列表中的位置&#xff0c;以便前端即時更新排隊信息。 思考 如…

【源碼】Spring Data JPA原理解析之Repository自定義方法命名規則執行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查詢、部分字段查詢 3、Spring Data JPA數據批量插入、批量更新真的用對了嗎 4、Spring Data JPA的一對一、LazyInitializationException異常、一對多、多對多操作 5、Spring Data JPA自定…

Oracle中TAF與SCANIP全面解析

TAF (Transparent Application Failover) 概念&#xff1a; TAF是Oracle數據庫提供的一個高級特性&#xff0c;旨在實現應用程序在數據庫連接中斷時的透明重連。它允許應用程序在數據庫故障發生時&#xff0c;無需修改代碼或手動干預&#xff0c;就能自動連接到新的數據庫實例…

Java垃圾回收_1

一、垃圾回收 1.如何判斷對象可以回收 &#xff08;1&#xff09;引用計數法 存在循環引用問題&#xff0c; Java未使用這種算法 在引用計數法中&#xff0c;每個對象都有一個引用計數器&#xff0c;記錄著指向該對象的引用數量。當引用計數器為零時&#xff0c;表示沒有任…

JavaSE:SE知識整體總結

1、引言 歷時一個多月的學習&#xff0c;已經掌握了JavaSE的知識&#xff0c;這篇博客就來做一下SE知識的總結~ 2、數據類型和變量 Java中的數據類型分為基本數據類型和引用數據類型。 2.1 基本數據類型 基本數據類型共有四類八種&#xff1a; 四類&#xff1a;整形、浮點…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如圖 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 為 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌編碼基礎模型 Codey,Codey 是…

SpringBoot HelloWorld 之 實現注冊功能

SpringBoot HelloWorld 之 實現注冊功能 一.配置 創建數據庫big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用戶名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3項目練習詳細步驟(第五部分:用戶模塊的功能)

頂部導航欄個人信息顯示 接口文檔 接口請求與綁定 導航欄下拉菜單功能 路由實現 退出登錄和路由跳轉實現 基本資料修改 頁面結構 接口文檔 接口請求與綁定 修改頭像 頁面結構 頭像回顯 頭像上傳 接口文檔 重置密碼 頁面結構 接口文檔 接口請求與綁定 頂部導航…

自然語言處理學習路線

學習目標 NLP 系統知識&#xff08;從入門到入土&#xff09; 學習內容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本預處理&#xff08;標點符號處理、繁體轉簡體、分詞Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;詞袋模型&#xff08;TF…

【T+】暢捷通T+軟件固定資產模塊反啟用

【問題描述】 暢捷通T軟件&#xff0c;固定資產模塊反啟用。 【解決方法】 針對賬套庫執行如下腳本清除資產的所有數據&#xff0c; 執行前請與客戶確認資產的所有數據都不要了&#xff0c;確認后備份賬套再執行腳本&#xff0c;切記&#xff01;&#xff01;&#xff01; 然后…