關(guān)于緩存
緩存是實(shí)際工作中非常常用的一種提高性能的方法。而在java中,所謂緩存,就是將程序或系統(tǒng)經(jīng)常要調(diào)用的對(duì)象存在內(nèi)存中,再次調(diào)用時(shí)可以快速從內(nèi)存中獲取對(duì)象,不必再去創(chuàng)建新的重復(fù)的實(shí)例。這樣做可以減少系統(tǒng)開銷,提高系統(tǒng)效率。
在增刪改查中,數(shù)據(jù)庫查詢占據(jù)了數(shù)據(jù)庫操作的80%以上,而非常頻繁的磁盤I/O讀取操作,會(huì)導(dǎo)致數(shù)據(jù)庫性能極度低下。而數(shù)據(jù)庫的重要性就不言而喻了:
數(shù)據(jù)庫通常是企業(yè)應(yīng)用系統(tǒng)最核心的部分
數(shù)據(jù)庫保存的數(shù)據(jù)量通常非常龐大
數(shù)據(jù)庫查詢操作通常很頻繁,有時(shí)還很復(fù)雜
在系統(tǒng)架構(gòu)的不同層級(jí)之間,為了加快訪問速度,都可以存在緩存
spring cache 特性與缺憾
現(xiàn)在市場上主流的緩存框架有ehcache、redis、memcached。spring cache可以通過簡單的配置就可以搭配使用起來。其中使用注解方式是最簡單的。
Cache 注解
從以上的注解中可以看出,雖然使用注解的確方便,但是缺少靈活的緩存策略,
緩存策略:
TTL(Time To Live ) 存活期,即從緩存中創(chuàng)建時(shí)間點(diǎn)開始直到它到期的一個(gè)時(shí)間段(不管在這個(gè)時(shí)間段內(nèi)有沒有訪問都將過期)
TTI(Time To Idle) 空閑期,即一個(gè)數(shù)據(jù)多久沒被訪問將從緩存中移除的時(shí)間
項(xiàng)目中可能有很多緩存的TTL不相同,這時(shí)候就需要編碼式使用編寫緩存。
條件緩存
根據(jù)運(yùn)行流程,如下@Cacheable將在執(zhí)行方法之前( #result還拿不到返回值)判斷condition,如果返回true,則查緩存;
如下@CachePut將在執(zhí)行完方法后(#result就能拿到返回值了)判斷condition,如果返回true,則放入緩存
如下@CachePut將在執(zhí)行完方法后(#result就能拿到返回值了)判斷unless,如果返回false,則放入緩存;(即跟condition相反)
如下@CacheEvict, beforeInvocation=false表示在方法執(zhí)行之后調(diào)用(#result能拿到返回值了);且判斷condition,如果返回true,則移除緩存;
小試牛刀,綜合運(yùn)用:
配置 ehcache 與 redis
spring cache集成ehcache,spring-ehcache.xml主要內(nèi)容:
spring cache集成redis,spring-redis.xml主要內(nèi)容:
項(xiàng)目中注解緩存只能配置一個(gè),所以可以通過以下引入哪個(gè)配置文件來決定使用哪個(gè)緩存。
當(dāng)然,可以通過其他配置搭配使用兩個(gè)緩存機(jī)制。比如ecache做一級(jí)緩存,redis做二級(jí)緩存。
更加詳細(xì)的使用與配置,可以參考項(xiàng)目中spring-shiro-training中有關(guān)spring cache的配置:https://git.oschina.net/wangzhixuan/spring-shiro-training.git
聯(lián)系客服