摘要:今天就介紹一款常用的緩存框架。設(shè)置緩存中對(duì)象是否為永久的,如果是,超時(shí)設(shè)置將被忽略,對(duì)象從不過期。內(nèi)存不足時(shí),是否啟用磁盤緩存。磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是秒。
在當(dāng)今大數(shù)據(jù)爆發(fā)時(shí)代,數(shù)據(jù)量每天都呈“爆炸式”增長,頻繁的數(shù)據(jù)庫訪問無疑給數(shù)據(jù)庫帶來的極大負(fù)載,除了增大物理服務(wù)器的數(shù)量,我們也可以將一些常用的、公共的資源以cache形式放在客戶端或者靠近客戶端的服務(wù)器上,從而減少了服務(wù)器的負(fù)載,進(jìn)一步也改善了系統(tǒng)的整體性能。今天就介紹一款常用的緩存框架---EhCache。什么是EhCache?
ehcache是現(xiàn)在最流行的純java開源框架,配置簡(jiǎn)單,結(jié)構(gòu)清晰,功能強(qiáng)大,最初知道它,是從hibernate的緩存開始的。網(wǎng)上中文的ehcache材料以簡(jiǎn)單的介紹和配置方法居多,如果你有這方面的問題,請(qǐng)自行看官網(wǎng)api文檔,但是很少見到特性說明和對(duì)實(shí)現(xiàn)原理的分析,因此在這這篇文章里面,我會(huì)詳細(xì)介紹和分析ehcache的特性,加上一些自己的理解和思考,希望對(duì)緩存感興趣的朋友有所收獲。EhCache入門教程
新建一個(gè)maven項(xiàng)目
在maven項(xiàng)目的pom.xml文件中添加對(duì)EhCache及Spring的依賴,如下所示:
4.0.0 com.imooc Ehcache 0.0.1-SNAPSHOT jar Ehcache http://maven.apache.org UTF-8 4.10 4.2.3.RELEASE net.sf.ehcache ehcache 2.10.2 junit junit ${junit.version} test org.springframework spring-test ${spring.version} test org.springframework spring-webmvc ${spring.version} org.springframework spring-core ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} aliyun aliyun http://maven.aliyun.com/nexus/content/groups/public
在src/main/resources目錄下創(chuàng)建ehcache的配置文件ehcache.xml,如下:
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
針對(duì)ehcache的配置文件的參數(shù)進(jìn)行詳細(xì)說明:
diskStore : ehcache支持內(nèi)存和磁盤兩種存儲(chǔ)
path :指定磁盤存儲(chǔ)的位置
默認(rèn)cache參數(shù)配置說明:
defaultCache : 默認(rèn)的緩存
* maxEntriesLocalHeap=”10000” * eternal=”false” * timeToIdleSeconds=”120” * timeToLiveSeconds=”120” * maxEntriesLocalDisk=”10000000” * diskExpiryThreadIntervalSeconds=”120” * memoryStoreEvictionPolicy=”LRU”
cache :自定的緩存,當(dāng)自定的配置不滿足實(shí)際情況時(shí)可以通過自定義(可以包含多個(gè)cache節(jié)點(diǎn))
* name : 緩存的名稱,可以通過指定名稱獲取指定的某個(gè)Cache對(duì)象 * maxElementsInMemory :內(nèi)存中允許存儲(chǔ)的最大的元素個(gè)數(shù),0代表無限個(gè) * clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除。 * eternal :設(shè)置緩存中對(duì)象是否為永久的,如果是,超時(shí)設(shè)置將被忽略,對(duì)象從不過期。根據(jù)存儲(chǔ)數(shù)據(jù)的不同,例如一些靜態(tài)不變的數(shù)據(jù)如省市區(qū)等可以設(shè)置為永不過時(shí) * timeToIdleSeconds : 設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0,也就是可閑置時(shí)間無窮大。 * timeToLiveSeconds :緩存數(shù)據(jù)的生存時(shí)間(TTL),也就是一個(gè)元素從構(gòu)建到消亡的最大時(shí)間間隔值,這只能在元素不是永久駐留時(shí)有效,如果該值是0就意味著元素可以停頓無窮長的時(shí)間。 * overflowToDisk :內(nèi)存不足時(shí),是否啟用磁盤緩存。 * maxEntriesLocalDisk:當(dāng)內(nèi)存中對(duì)象數(shù)量達(dá)到maxElementsInMemory時(shí),Ehcache將會(huì)對(duì)象寫到磁盤中。 * maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。 * diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)。 * diskPersistent:是否在VM重啟時(shí)存儲(chǔ)硬盤的緩存數(shù)據(jù)。默認(rèn)值是false。 * diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒。
ehcache緩存的3種清空策略:
1 FIFO,先進(jìn)先出
2 LFU,最少被使用,緩存的元素有一個(gè)hit屬性,hit值最小的將會(huì)被清出緩存。
3 LRU,最近最少使用的,緩存的元素有一個(gè)時(shí)間戳,當(dāng)緩存容量滿了,而又需要騰出地方來緩存新的元素的時(shí)候,那么現(xiàn)有緩存元素中時(shí)間戳離當(dāng)前時(shí)間最遠(yuǎn)的元素將被清出緩存。
編輯代碼測(cè)試Ehcache
package com.imooc.Ehcache;
import java.io.InputStream;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
* 通過配置文件(ehcache.xml)來使用緩存 * @author Administrator
*/ public class EhCache2 { public static void main(String[] args) { //通過讀取ehcache配置文件來創(chuàng)建緩存管理器即CacheManager InputStream in = EhCache2.class.getClassLoader().getResourceAsStream("ehcache1.xml"); CacheManager cacheManager = CacheManager.create(in); // 創(chuàng)建一個(gè)緩存實(shí)例(在配置文件中獲取一個(gè)緩存實(shí)例) final Cache cache = cacheManager.getCache("helloworld1"); final String key = "greeting"; final String key1 = "greeting1"; //創(chuàng)建一個(gè)數(shù)據(jù)容器來存放我們所創(chuàng)建的element final Element putGreeting = new Element(key, "Hello, World!"); final Element putGreeting1 = new Element(key1, "Hello Ehcache"); //將數(shù)據(jù)放入到緩存實(shí)例中 cache.put(putGreeting); cache.put(putGreeting1); //取值 final Cache cache2 = cacheManager.getCache("helloworld1"); final Element getGreeting = cache2.get(key); final Element getGreeting1 = cache2.get(key1); // Print the value System.out.println("value======//========"+getGreeting.getObjectValue()); System.out.println("value1=====//========"+getGreeting1.getObjectKey()); } }
結(jié)果驗(yàn)證,如果后臺(tái)輸出如下字段即在指定的cache存放文件夾找到創(chuàng)建的cache就說明我們打開了學(xué)習(xí)EhCache大門。
后臺(tái)輸出: value======//========Hello, World!
value1=====//========greeting1
最后附上本次實(shí)例的源碼:
鏈接:https://pan.baidu.com/s/1nu6rrz7 密碼:p5vw
Ehcache官方文檔下載鏈接:鏈接:https://pan.baidu.com/s/1cyg3Tk 密碼:0zf0
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68077.html
摘要:一級(jí)緩存值得注意的地方默認(rèn)就是支持一級(jí)緩存的,并不需要我們配置和整合后進(jìn)行代理開發(fā),不支持一級(jí)緩存,和整合,按照的模板去生成代理對(duì)象,模板中在最后統(tǒng)一關(guān)閉??偨Y(jié)的一級(jí)緩存是級(jí)別的。 前言 本文主要講解Mybatis的以下知識(shí)點(diǎn): Mybatis緩存 一級(jí)緩存 二級(jí)緩存 與Ehcache整合 Mapper代理 使用Mapper代理就不用寫實(shí)現(xiàn)類了 逆向工程 自動(dòng)生成代碼 ...
摘要:添加用戶接口類簡(jiǎn)單用戶鏈接數(shù)據(jù)庫微服務(wù)通過注解標(biāo)注該類為持久化操作對(duì)象。查找用戶數(shù)據(jù)保存用戶數(shù)據(jù)更新用戶數(shù)據(jù)刪除用戶數(shù)據(jù)這是清除緩存添加緩存配置緩存配置。對(duì)象是否永久有效,一但設(shè)置了,將不起作用。設(shè)置對(duì)象在失效前允許存活時(shí)間單位秒。 SpringCloud(第 045 篇)鏈接Mysql數(shù)據(jù)庫簡(jiǎn)單的集成Mybatis、ehcache框架采用MapperXml訪問數(shù)據(jù)庫 - 一、大致介紹...
摘要:官網(wǎng)源碼推薦從開始手寫一個(gè)框架更多請(qǐng)?jiān)诩夹g(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字。是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將與數(shù)據(jù)庫表建立映射關(guān)系,是一個(gè)全自動(dòng)的框架。 Java 程序員方向太多,且不說移動(dòng)開發(fā)、大數(shù)據(jù)、區(qū)塊鏈、人工智能這些,大部分 Java 程序員都是 Java Web/后端開發(fā)。那作為一名 Java Web 開發(fā)程序員必須需要熟悉哪些框架呢? 今天...
摘要:前言如題,今天介紹的數(shù)據(jù)緩存。說明確實(shí)做了數(shù)據(jù)緩存,第二次的測(cè)試結(jié)果是從數(shù)據(jù)緩存中獲取的,并沒有直接查數(shù)據(jù)庫。為為的數(shù)據(jù)做了緩存插入數(shù)據(jù)返回的結(jié)果數(shù)據(jù)庫中的結(jié)果訪問結(jié)果如下圖。后語以上為數(shù)據(jù)緩存的教程。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問題。 前言 如題,今天介紹 SpringBoot 的數(shù)據(jù)緩存。做過開發(fā)的都知道程序的瓶頸在于數(shù)據(jù)庫,我們也知道內(nèi)...
閱讀 3064·2023-04-26 03:01
閱讀 3549·2023-04-25 19:54
閱讀 1607·2021-11-24 09:39
閱讀 1386·2021-11-19 09:40
閱讀 4267·2021-10-14 09:43
閱讀 2102·2019-08-30 15:56
閱讀 1507·2019-08-30 13:52
閱讀 1669·2019-08-29 13:05