springcache

在springcache之前

在沒(méi)有使springcache之前我們使用緩存的方式是這樣的:

 Map<StoreKey, List<SpecialHall>> keyListHashMap = Maps.newHashMap();
        DateTime dt = new DateTime().withHourOfDay(2).plusDays(1);
        DateTime now = DateTime.now();
        int toTwo = (int) (dt.getMillis() - now.getMillis()) / 1000;
        List<SpecialHall> resList = Lists.newArrayList();
        for (Integer cinemaId : cinemaIds) {
            StoreKey storeKey = new StoreKey(CacheConstants.GDATA_STRING, String.format(CacheConstants.GATEWAY_SPECIALS_BY_CINEMAID, cinemaId));
            keyListHashMap.put(storeKey, resList);
            returnTocMap.put(cinemaId, transToTSpecialHallToApp(resList));
        }
        redisStoreClient.multiSet(keyListHashMap, toTwo);

這段代碼我剛開(kāi)始看的時(shí)候也覺(jué)得沒(méi)問(wèn)題,還覺(jué)得寫的挺好的(因?yàn)槭俏覍懙耐敌Γ任铱吹搅藄pringcache之后我覺(jué)得這段代碼就不是那么的優(yōu)雅了粘秆,總體來(lái)說(shuō)就是代碼的處理邏輯和緩存耦合在一起,降低了代碼的可讀性,不利于后期人員的維護(hù);還有就是緩存切換的話成本很大昔善,需要改動(dòng)的地方比較多,風(fēng)險(xiǎn)成本比較高畔乙。

在springcache之后
springcache是什么君仆?

首先,要明白springcache是一種解決緩存的方案牲距,而不是一種具體的緩存方式(類似的Redis返咱,memcache,ehcache等等)牍鞠。

springcache的相關(guān)配置

pom配置:
這里需要注意spring應(yīng)該是3.1+

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

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.1.RELEASE</version>
        </dependency>

springcache相關(guān)xml配置

 <!-- ehcache -->
    <cache:annotation-driven cache-manager="ehcacheManager"/>
    <!-- 聲明cacheManager -->
    <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManagerFactory" />
    </bean>
    <!-- cacheManager工廠類咖摹,指定ehcache.xml的位置 -->
    <bean id="ehcacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml" />
    </bean>

還需要配置具體的緩存:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false">
    <diskStore path="/Users/yuxi/work/myoschina/tmpdir"/>
    <!--
    name:緩存名稱。
    maxElementsInMemory:緩存最大個(gè)數(shù)难述。
    eternal:對(duì)象是否永久有效萤晴,一但設(shè)置了,timeout將不起作用龄广。
    timeToIdleSeconds:設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)硫眯。
    僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用蕴侧,可選屬性择同,默認(rèn)值是0,也就是可閑置時(shí)間無(wú)窮大净宵。
    timeToLiveSeconds:設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)敲才。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間。
    僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用择葡,默認(rèn)是0.紧武,也就是對(duì)象存活時(shí)間無(wú)窮大。
    overflowToDisk:當(dāng)內(nèi)存中對(duì)象數(shù)量達(dá)到maxElementsInMemory時(shí)敏储,Ehcache將會(huì)對(duì)象寫到磁盤中阻星。
    diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)妥箕。
    maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)滥酥。
    diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù) Whether the disk store persists between restarts
    of the Virtual Machine. The default value is false.
    diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒畦幢。
    memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí)坎吻,Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存。
    默認(rèn)策略是LRU(最近最少使用)宇葱。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)瘦真。
    clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除。
    -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="60"
            timeToLiveSeconds="60"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="true"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    />
    <cache name="dbCache" maxElementsInMemory="10000" eternal="false"
           timeToLiveSeconds="1800" overflowToDisk="false" diskPersistent="true"/>
</ehcache>
springcache的相關(guān)代碼實(shí)現(xiàn)
package com.yuxi.cache;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * Created by yuxi on 2017/9/28.
 */
@Service("cacheService")
public class CacheService {

    @Cacheable(value = "dbCache", key = "'info_' + #id")
    public Info getInfo(Integer id) {
        System.out.println("from cache");
        return getDb(id);
    }

    private Info getDb(Integer id) {
        System.out.println("from db" + id);
        return new Info(id);
    }


    @CachePut(value = "dbCache", key = "'info_' + #id")
    public Info getInfo2(Integer id) {
        System.out.println("from cache put");
        return getDb(id);
    }


    @CacheEvict(value = "dbCache", key = "'info_' + #id")
    public boolean delete(Integer id) {
        System.out.println("delete");
        return true;
    }
}

相關(guān)測(cè)試類

package com.yuxi.main;

import com.yuxi.cache.CacheService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by yuxi on 2017/8/5.
 */
public class KnightMain {
    public static void main(String[] args) {
        // spring 應(yīng)用上下文
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("knight.xml");
   
        CacheService cacheService = (CacheService) applicationContext.getBean("cacheService");
        cacheService.getInfo(1);
        cacheService.getInfo(1);
        cacheService.getInfo(1);
        cacheService.getInfo(1);
        cacheService.getInfo(1);

        cacheService.getInfo2(1);
        cacheService.getInfo2(1);
        cacheService.getInfo2(1);
        cacheService.delete(1);
    }
}

相關(guān)的測(cè)試結(jié)果為:

from cache
from db1
from cache put
from db1
from cache put
from db1
from cache put
from db1
delete
springcache的相關(guān)注解說(shuō)明:

三圖勝過(guò)萬(wàn)言黍瞧,圖片來(lái)自郭老師的wiki诸尽,不要問(wèn)我郭老師是誰(shuí)?他是一個(gè)傳說(shuō)雷逆。

郭老師的wiki
郭老師的wiki
郭老師的wiki

相關(guān)代碼可以參考:springcache

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弦讽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膀哲,更是在濱河造成了極大的恐慌往产,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件某宪,死亡現(xiàn)場(chǎng)離奇詭異仿村,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)兴喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門蔼囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人衣迷,你說(shuō)我怎么就攤上這事畏鼓。” “怎么了壶谒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵云矫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汗菜,道長(zhǎng)让禀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任陨界,我火速辦了婚禮巡揍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菌瘪。我一直安慰自己腮敌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著糜工,像睡著了一般斗这。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啤斗,一...
    開(kāi)封第一講書(shū)人閱讀 52,895評(píng)論 1 314
  • 那天表箭,我揣著相機(jī)與錄音,去河邊找鬼钮莲。 笑死免钻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崔拥。 我是一名探鬼主播极舔,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼链瓦!你這毒婦竟也來(lái)了拆魏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慈俯,失蹤者是張志新(化名)和其女友劉穎渤刃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贴膘,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卖子,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刑峡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洋闽。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖突梦,靈堂內(nèi)的尸體忽然破棺而出诫舅,到底是詐尸還是另有隱情,我是刑警寧澤宫患,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布刊懈,位于F島的核電站,受9級(jí)特大地震影響撮奏,放射性物質(zhì)發(fā)生泄漏俏讹。R本人自食惡果不足惜当宴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一畜吊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧户矢,春花似錦玲献、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓢娜。三九已至,卻和暖如春礼预,著一層夾襖步出監(jiān)牢的瞬間眠砾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工托酸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褒颈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓励堡,卻偏偏與公主長(zhǎng)得像谷丸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子应结,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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

  • 一刨疼、MemCache簡(jiǎn)介 session MemCache是一個(gè)自由、源碼開(kāi)放鹅龄、高性能揩慕、分布式的分布式內(nèi)存對(duì)象緩存...
    李偉銘MIng閱讀 3,827評(píng)論 2 13
  • 實(shí)現(xiàn)目標(biāo) 在客戶端請(qǐng)求訪問(wèn)到業(yè)務(wù)層之前使用緩存攔截,使得大部分的流量轉(zhuǎn)向到緩存而不是數(shù)據(jù)庫(kù)扮休,降低數(shù)據(jù)庫(kù)壓力漩绵。提高用...
    哥別打臉閱讀 952評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,352評(píng)論 25 707
  • 1、memcache的概念肛炮? Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng)止吐,通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,243評(píng)論 2 12
  • 張愛(ài)玲的小說(shuō)《半生緣》我讀過(guò)兩次,另外還看過(guò)些林心如和蔣勤勤演的電視劇版侨糟。 因?yàn)橄矚g這部小說(shuō)碍扔,所以才會(huì)去看電視劇,...
    悠然小蝦閱讀 2,733評(píng)論 0 3