Ehcache緩存框架入門級使用

前言

JAVA緩存實現(xiàn)方案有很多朽色,最基本的自己使用Map去構建緩存麸拄,或者使用memcached或Redis征绸,但是上述兩種緩存框架都要搭建服務器克锣,而Map自行構建的緩存可能沒有很高的使用效率赖晶,那么我們可以嘗試一下使用Ehcache緩存框架律适。

Ehcache主要基于內(nèi)存緩存,磁盤緩存為輔的遏插,使用起來方便捂贿。下面介紹如何在項目中使用Ehcache

入門使用教程

1.maven引用

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.10.4</version>
</dependency>

2.在classpath下建立一個ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--timeToIdleSeconds 當緩存閑置n秒后銷毀 --> 
<!--timeToLiveSeconds 當緩存存活n秒后銷毀 --> 
<!-- 
緩存配置 
       name:緩存名稱。 
       maxElementsInMemory:緩存最大個數(shù)涩堤。 
       eternal:對象是否永久有效眷蜓,一但設置了,timeout將不起作用胎围。 
       timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)吁系。僅當eternal=false對象不是永久有效時使用,可選屬性白魂,默認值是0汽纤,也就是可閑置時間無窮大。 
       timeToLiveSeconds:設置對象在失效前允許存活時間(單位:秒)福荸。最大時間介于創(chuàng)建時間和失效時間之間蕴坪。僅當eternal=false對象不是永久有效時使用,默認是0.敬锐,也就是對象存活時間無窮大背传。 
       overflowToDisk:當內(nèi)存中對象數(shù)量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中台夺。 
       diskSpoolBufferSizeMB:這個參數(shù)設置DiskStore(磁盤緩存)的緩存區(qū)大小径玖。默認是30MB。每個Cache都應該有自己的一個緩沖區(qū)颤介。 
       maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)梳星。 
       diskPersistent:是否緩存虛擬機重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false. 
       diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔赞赖,默認是120秒。 
       memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時冤灾,Ehcache將會根據(jù)指定的策略去清理內(nèi)存前域。默認策略是LRU(最近最少使用)。你可以設置為FIFO(先進先出)或是LFU(較少使用)韵吨。 
       clearOnFlush:內(nèi)存數(shù)量最大時是否清除匿垄。 
-->
    <!-- 磁盤緩存位置 -->
    <diskStore path="java.io.tmpdir/easylink-mall-web/ehcache"/>
    <!-- 默認緩存 -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    <!-- 商戶申請數(shù)據(jù)緩存 數(shù)據(jù)緩存40分鐘 -->
    <cache
            name="merchant-apply-cache"
            eternal="false"
            timeToIdleSeconds="2400"
            timeToLiveSeconds="2400"
            maxEntriesLocalHeap="10000"
            maxEntriesLocalDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            overflowToDisk="false"
            memoryStoreEvictionPolicy="LRU">
    </cache>
</ehcache>

3.與spring的cacheManager結合使用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/cache
          http://www.springframework.org/schema/cache/spring-cache.xsd">

    <!-- 支持緩存注解 -->
    <cache:annotation-driven cache-manager="cacheManager" />

    <!-- 默認是cacheManager -->
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager"  ref="cacheManagerFactory"/>
    </bean>

    <!-- cache管理器配置 -->
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation"  value="classpath:ehcache.xml"/>
        <property name="shared" value="true" />
    </bean>

</beans>

4.代碼使用


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.baomidou.mybatisplus.toolkit.IdWorker;
import com.easylink.mall.entity.Merchant;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/spring.xml")
public class EhcacheTest {

    @Autowired
    private CacheManager cacheManager;

    @Test
    public void execute() {
        // 獲取商戶申請緩存容器
        Cache cache = cacheManager.getCache("merchant-apply-cache");
        Merchant merchant = new Merchant();
        Long id = IdWorker.getId();
        merchant.setId(id);
        merchant.setName("緩存測試");
        // 將商戶申請數(shù)據(jù)添加至緩存中 // key : id value : object
        cache.put(id, merchant);
        // 獲取商戶申請數(shù)據(jù)
        // 方法1
        Merchant cacheMerchant1 = (Merchant) cache.get(id).get();
        System.out.println(cacheMerchant1.getName());
        // 方法2
        Merchant cacheMerchant2 = cache.get(id, Merchant.class);
        System.out.println(cacheMerchant2.getName());
        // 將商戶申請數(shù)據(jù)從緩存中移除
        cache.evict(id);
    }

}

5.注意事項

cache.get(key) 和cache.get(key, class);方法,由于不知道你存入的key是什么類型学赛,所以get的時候不會做key的類型檢查年堆,如上述例子中

Long id = IdWorker.getId();
cache.put(id, merchant);
Merchant cacheMerchant2 = cache.get(id, Merchant.class);

put進去時的key是Long類型的,get的時候也只能傳入對應Long類型的key才能獲取到對應的value盏浇,如果傳入的是String類型的key变丧,即使兩個key的值是一致的,也會導致無法獲取到對應的value绢掰。這個情況很容易發(fā)生在對request請求的參數(shù)痒蓬,由于是String字符串類型,但是忘了做類型轉(zhuǎn)換就直接把這個String當做key去獲取對應的value滴劲。導致獲取不到攻晒,請同學們要注意,親身經(jīng)歷班挖,血與淚的教訓鲁捏。

總結

以上就是我自己總結的Ehcache入門級用法,Ehcache是個不錯的內(nèi)存緩存框架萧芙,如果沒使用過的話给梅,可以嘗試使用。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双揪,一起剝皮案震驚了整個濱河市动羽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渔期,老刑警劉巖运吓,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疯趟,居然都是意外死亡拘哨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門信峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宅静,“玉大人,你說我怎么就攤上這事站欺∫碳校” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵矾策,是天一觀的道長磷账。 經(jīng)常有香客問我,道長贾虽,這世上最難降的妖魔是什么逃糟? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蓬豁,結果婚禮上绰咽,老公的妹妹穿的比我還像新娘。我一直安慰自己地粪,他們只是感情好取募,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟆技,像睡著了一般玩敏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上质礼,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天旺聚,我揣著相機與錄音,去河邊找鬼眶蕉。 笑死砰粹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的造挽。 我是一名探鬼主播碱璃,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刽宪!你這毒婦竟也來了厘贼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤圣拄,失蹤者是張志新(化名)和其女友劉穎嘴秸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庇谆,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡岳掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饭耳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串述。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寞肖,靈堂內(nèi)的尸體忽然破棺而出纲酗,到底是詐尸還是另有隱情邑跪,我是刑警寧澤阳仔,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響诱篷,放射性物質(zhì)發(fā)生泄漏幻馁。R本人自食惡果不足惜提鸟,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一伏伐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸠补,春花似錦萝风、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至被因,卻和暖如春卿拴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梨与。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工堕花, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粥鞋。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓缘挽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呻粹。 傳聞我的和親對象是個殘疾皇子壕曼,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)等浊,斷路器腮郊,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法筹燕,內(nèi)部類的語法轧飞,繼承相關的語法,異常的語法撒踪,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 理論總結 它要解決什么樣的問題过咬? 數(shù)據(jù)的訪問、存取制妄、計算太慢掸绞、太不穩(wěn)定、太消耗資源耕捞,同時衔掸,這樣的操作存在重復性烫幕。因...
    jiangmo閱讀 2,842評論 0 11
  • 一、簡介 Ehcache是一個用Java實現(xiàn)的使用簡單具篇,高速纬霞,實現(xiàn)線程安全的緩存管理類庫,ehcache提供了用內(nèi)...
    小程故事多閱讀 43,823評論 9 59
  • 讀〈〈道德經(jīng)〉〉無中生有 反者道之動驱显,弱者道之用。天下萬物生于有瞳抓,有生于無埃疫。 道的運動是通過循環(huán)往復實現(xiàn)的,道的作...
    進學致和閱讀 396評論 0 1