[轉(zhuǎn)載]Spring Boot緩存實戰(zhàn) Caffeine

Caffeine和Spring Boot集成

Caffeine是使用Java8對Guava緩存的重寫版本,在Spring Boot 2.0中將取代Guava。如果出現(xiàn)Caffeine溪北,CaffeineCacheManager將會自動配置。使用spring.cache.cache-names屬性可以在啟動時創(chuàng)建緩存,并可以通過以下配置進行自定義(按順序):

spring.cache.caffeine.spec: 定義的特殊緩存
com.github.benmanes.caffeine.cache.CaffeineSpec: bean定義
com.github.benmanes.caffeine.cache.Caffeine: bean定義
例如盲泛,以下配置創(chuàng)建一個foo和bar緩存,最大數(shù)量為500键耕,存活時間為10分鐘:

spring.cache.cache-names=foo,bar
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

除此之外寺滚,如果定義了com.github.benmanes.caffeine.cache.CacheLoader,它會自動關(guān)聯(lián)到CaffeineCacheManager屈雄。由于該CacheLoader將關(guān)聯(lián)被該緩存管理器管理的所有緩存村视,所以它必須定義為CacheLoader<Object, Object>,自動配置將忽略所有泛型類型酒奶。

引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.6.0</version>
</dependency>

開啟緩存的支持

使用@EnableCaching注解讓Spring Boot開啟對緩存的支持

@SpringBootApplication
@EnableCaching// 開啟緩存蚁孔,需要顯示的指定
public class SpringBootStudentCacheCaffeineApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootStudentCacheCaffeineApplication.class, args);
    }
}

配置文件

新增對緩存的特殊配置奶赔,如最大容量、過期時間等

spring.cache.cache-names=people
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

如果使用了refreshAfterWrite配置還必須指定一個CacheLoader杠氢,如:

/**
 * 必須要指定這個Bean站刑,refreshAfterWrite=5s這個配置屬性才生效
 *
 * @return
 */
@Bean
public CacheLoader<Object, Object> cacheLoader() {

    CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {

        @Override
        public Object load(Object key) throws Exception {
            return null;
        }

        // 重寫這個方法將oldValue值返回回去,進而刷新緩存
        @Override
        public Object reload(Object key, Object oldValue) throws Exception {
            return oldValue;
        }
    };

    return cacheLoader;
}

Caffeine配置說明:

initialCapacity=[integer]: 初始的緩存空間大小
maximumSize=[long]: 緩存的最大條數(shù)
maximumWeight=[long]: 緩存的最大權(quán)重
expireAfterAccess=[duration]: 最后一次寫入或訪問后經(jīng)過固定時間過期
expireAfterWrite=[duration]: 最后一次寫入后經(jīng)過固定時間過期
refreshAfterWrite=[duration]: 創(chuàng)建緩存或者最近一次更新緩存后經(jīng)過固定的時間間隔鼻百,刷新緩存
weakKeys: 打開key的弱引用
weakValues:打開value的弱引用
softValues:打開value的軟引用
recordStats:開發(fā)統(tǒng)計功能

注意:

expireAfterWrite和expireAfterAccess同事存在時绞旅,以expireAfterWrite為準。
maximumSize和maximumWeight不可以同時使用
weakValues和softValues不可以同時使用

示例代碼

/**
 * @author yuhao.wang
 */
@Service
public class PersonServiceImpl implements PersonService {
    private static final Logger logger = LoggerFactory.getLogger(PersonServiceImpl.class);

    @Autowired
    PersonRepository personRepository;

    @Override
    @CachePut(value = "people", key = "#person.id")
    public Person save(Person person) {
        Person p = personRepository.save(person);
        logger.info("為id温艇、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
        return p;
    }

    @Override
    @CacheEvict(value = "people")//2
    public void remove(Long id) {
        logger.info("刪除了id因悲、key為" + id + "的數(shù)據(jù)緩存");
        //這里不做實際刪除操作
    }

    /**
     * Cacheable
     * value:緩存key的前綴。
     * key:緩存key的后綴勺爱。
     * sync:設(shè)置如果緩存過期是不是只放一個請求去請求數(shù)據(jù)庫晃琳,其他請求阻塞,默認是false琐鲁。
     */
    @Override
    @Cacheable(value = "people", key = "#person.id", sync = true)
    public Person findOne(Person person, String a, String[] b, List<Long> c) {
        Person p = personRepository.findOne(person.getId());
        logger.info("為id卫旱、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
        return p;
    }

    @Override
    @Cacheable(value = "people1")//3
    public Person findOne1() {
        Person p = personRepository.findOne(2L);
        logger.info("為id、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
        return p;
    }

    @Override
    @Cacheable(value = "people2")//3
    public Person findOne2(Person person) {
        Person p = personRepository.findOne(person.getId());
        logger.info("為id绣否、key為:" + p.getId() + "數(shù)據(jù)做了緩存");
        return p;
    }
}

鏈接:http://www.reibang.com/p/c72fb0c787fc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊涯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒜撮,更是在濱河造成了極大的恐慌暴构,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段磨,死亡現(xiàn)場離奇詭異取逾,居然都是意外死亡,警方通過查閱死者的電腦和手機苹支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門砾隅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人债蜜,你說我怎么就攤上這事晴埂。” “怎么了寻定?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵儒洛,是天一觀的道長。 經(jīng)常有香客問我狼速,道長琅锻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮恼蓬,結(jié)果婚禮上惊完,老公的妹妹穿的比我還像新娘。我一直安慰自己处硬,他們只是感情好小槐,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郁油,像睡著了一般本股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐腌,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音苟径,去河邊找鬼案站。 笑死,一個胖子當著我的面吹牛棘街,可吹牛的內(nèi)容都是我干的蟆盐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼遭殉,長吁一口氣:“原來是場噩夢啊……” “哼石挂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起险污,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痹愚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛔糯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯腮,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年蚁飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了动壤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡淮逻,死狀恐怖琼懊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爬早,我是刑警寧澤哼丈,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凸椿,受9級特大地震影響削祈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一髓抑、第九天 我趴在偏房一處隱蔽的房頂上張望咙崎。 院中可真熱鬧,春花似錦吨拍、人聲如沸褪猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伊滋。三九已至,卻和暖如春队秩,著一層夾襖步出監(jiān)牢的瞬間笑旺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工馍资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筒主,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓鸟蟹,卻偏偏與公主長得像乌妙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子建钥,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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