01.Spring 緩存抽象

Spring 參考了JSR107 自己設(shè)計了一套緩存抽象宛蚓。要使用緩存首先在主類上標(biāo)注@EnableCaching雏蛮。

@SpringBootApplication
@EnableCaching
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

01 @Cacheable

@Cacheable標(biāo)注在方法上蛋哭,作用是將方法返回的數(shù)據(jù)緩存起來添祸,每次調(diào)用方法之前都先去看緩存中是否有相應(yīng)的返回值堡距,若有直接返回緩存中的數(shù)據(jù),不調(diào)用該方法拒名,這個注解有如下屬性:

  • cacheNames/value:指定將數(shù)據(jù)要緩存到哪個 Cache。
  • key:指定數(shù)據(jù)在緩存中的 key芋酌,默認(rèn)時方法傳入的參數(shù)增显,該屬性的值是 SpEL 表達(dá)式,#id 取出傳入的 id 值脐帝。
  • keyGenerator:自定義 key 的生成器同云,key 和 keyGenerator 只能二選一。
  • condition:值是 SpEL 表達(dá)式堵腹,滿足條件才緩存炸站。
  • unless:值是 SpEL 表達(dá)式,滿足條件不緩存疚顷。
  • sync:是否使用異步模式旱易,默認(rèn)值為 false,開啟后返回的數(shù)據(jù)將以異步的形式緩存到 Cache 中腿堤。
@Service
public class EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Cacheable(value = "emp", key = "#id")
    public Emp getEmp(Integer id) {
        System.out.println("get emp...");
        return empMapper.selectEmpById(id);
    }
}

02 @CachePut

這個注解標(biāo)注在方法上阀坏,它的機制是每次調(diào)用方法后將方法返回值放入緩存,一般用它來完成同步更新緩存笆檀。但要明白的是如果你采用的是動態(tài)拼接字符串的方式來更新數(shù)據(jù)忌堂,那么前端傳來更新對象如果有空字段,若更新方法直接返回該對象酗洒,那么緩存的對象會和數(shù)據(jù)庫不一致士修,它的屬性和前面的大同小異。

@CachePut(value = "emp", key = "#result.empId")
    public Emp updateEmp(Emp emp) {
        empMapper.updateEmp(emp);
        return emp;
    }

03 @CacheEvict

這個注解標(biāo)在方法上樱衷,它的屬性和之前的大同小異李命,每次調(diào)用方法都會從緩存中刪除數(shù)據(jù),默認(rèn)在調(diào)用方法之后刪除緩存箫老。

  • allEntries:默認(rèn)為 false封字,指定為 true 后會清空緩存中所有數(shù)據(jù)。
  • beforeInvocation:默認(rèn)為 false耍鬓,指定為 true 后會在調(diào)用方法之前刪除緩存阔籽。
@CacheEvict(value = "emp", key = "#id")
    public void removeEmp(Integer id) {
        System.out.println("已刪除...");
    }

04 @Caching

這個注解標(biāo)注在方法上,用于復(fù)雜的緩存規(guī)則牲蜀,其屬性如下:

public @interface Caching {
    Cacheable[] cacheable() default {};
    CachePut[] put() default {};
    CacheEvict[] evict() default {};
}

舉個例子笆制,當(dāng)按名字查詢員工時,同時以它的 id 和 name 作為 key 將其緩存起來涣达,下次按照 id 來查員工就直接可以從緩存中取數(shù)據(jù)在辆,值得注意的是由于此方法也被 @CachePut 標(biāo)注了证薇,那么每次按照名字來查詢都會調(diào)用此方法。

@Caching(
        cacheable = {
            @Cacheable(value="emp", key = "#name")
        },
        put = {
            @CachePut(value = "emp", key = "#result.empId")
        }
    )
    public Emp getNameByName(String name) {
        System.out.println("按照名字查詢...");
        return empMapper.selectEmpByName(name);
    }

@CaheConfig
該注解用來標(biāo)注在類上匆篓,使用來抽取通用緩存配置的浑度,其熟悉如下:

public @interface CacheConfig {
    String[] cacheNames() default {};
    String keyGenerator() default "";
    String cacheManager() default "";
    String cacheResolver() default "";
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸦概,隨后出現(xiàn)的幾起案子箩张,更是在濱河造成了極大的恐慌,老刑警劉巖窗市,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先慷,死亡現(xiàn)場離奇詭異,居然都是意外死亡咨察,警方通過查閱死者的電腦和手機论熙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摄狱,“玉大人脓诡,你說我怎么就攤上這事《叮” “怎么了誉券?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵指厌,是天一觀的道長刊愚。 經(jīng)常有香客問我,道長踩验,這世上最難降的妖魔是什么鸥诽? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮箕憾,結(jié)果婚禮上牡借,老公的妹妹穿的比我還像新娘。我一直安慰自己袭异,他們只是感情好钠龙,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著御铃,像睡著了一般碴里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上上真,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天咬腋,我揣著相機與錄音,去河邊找鬼睡互。 笑死根竿,一個胖子當(dāng)著我的面吹牛陵像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寇壳,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼醒颖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九巡?” 一聲冷哼從身側(cè)響起图贸,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冕广,沒想到半個月后疏日,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撒汉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年沟优,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬辐。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡挠阁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溯饵,到底是詐尸還是另有隱情侵俗,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布丰刊,位于F島的核電站隘谣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啄巧。R本人自食惡果不足惜寻歧,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秩仆。 院中可真熱鬧码泛,春花似錦、人聲如沸澄耍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐莲。三九已至痢站,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铅搓,已是汗流浹背瑟押。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留星掰,地道東北人多望。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓嫩舟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怀偷。 傳聞我的和親對象是個殘疾皇子家厌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

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