spring 緩存中@Cacheable、@CachePut和@CacheEvict介紹 以及#p0的含義

package com.roncoo.example.cache.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;

import com.roncoo.example.bean.RoncooUserLog;
import com.roncoo.example.cache.RoncooUserLogCache;
import com.roncoo.example.dao.RoncooUserLogDao;

/**
 * @author wei.liu
 */
@CacheConfig(cacheNames = "roncooCache")
@Repository
public class RoncooUserLogCacheImpl implements RoncooUserLogCache {

	@Autowired
	private RoncooUserLogDao roncooUserLogDao;

	@Cacheable(key = "#p0")
	@Override
	public RoncooUserLog selectById(Integer id) {
		System.out.println("查詢功能,緩存找不到,直接讀庫, id=" + id);
		return roncooUserLogDao.findOne(id);
	}

	@CachePut(key = "#p0")
	@Override
	public RoncooUserLog updateById(RoncooUserLog roncooUserLog) {
		System.out.println("更新功能,更新緩存,直接寫庫, id=" + roncooUserLog);
		return roncooUserLogDao.save(roncooUserLog);
	}

	@CacheEvict(key = "#p0")
	@Override
	public String deleteById(Integer id) {
		System.out.println("刪除功能,刪除緩存,直接寫庫, id=" + id);
		return "清空緩存成功";
	}

}

 

一、@Cacheable:主要用來配置方法,可以根據方法的請求參數對其結果進行緩存。即當重複使用相同參數調用方法的時候,方法自己不會被調用執行,即方法自己被略過了,取而代之的是方法的結果直接從緩存中找到並返回了。spring

參數介紹緩存

  • value:緩存的名字,必須指定至少一個。ide

  • key:緩存的key,能夠爲空,若是指定要按照SpEL表達式編寫;若是不指定,則缺省按照方法的全部參數進行組合。code

  • condition:緩存的條件,能夠爲空,使用SpEL編寫,返回true或者false,只有爲true才能緩存。get

    例子:it

@Cacheable(value="shops:detail",key="'id:'+#p0")
    public Shop getById(String id);
  • 這兩行代碼的意思是指,緩存的名字爲:shops:detail,其中緩存的key值爲id:id的值。其中#p0的意思是指加有@Cacheable註解的方法中的第一個參數

二、@CacheEvict:主要對方法配置,用來標記要清空緩存的方法,當這個方法被調用並知足必定條件後,即會清空緩存。io

參數解析class

  • value:緩存的位置,不能爲空。
  • key:緩存的key,默認爲空。
  • condition:觸發的條件,只有知足條件的狀況纔會清楚緩存,默認爲空,支持SpEL。
  • allEntries:true表示清除value中的所有緩存,默認爲false。import

    例子:配置

@CacheEvict(value="shops:detail",key="'id:'+#p0['id']",condition="#p0['id']>0")
    public Shop getById(Map<String, Object> param);
  • 上面兩行代碼表示,只要param中key爲id的值大於0,將進行緩存操做,不然直接調用調用getById方法返回結果。
@Caching(evict={@CacheEvict(value="shops:brief",allEntries=true)})
    public void delete(String id);
  •  

上面兩行代碼表示,只要執行了delete方法,就刷新緩存名爲」shops:brief」下面的全部緩存。

三、@CachePut:主要針對方法的配置,可以根據方法的請求參數對其結果進行緩存,和@Cacheable不一樣的是,它每次都會觸發真實方法的調用。

@CachePut(value="shops:detail",key="'id:'+#p0['id']")
    public Shop update(Map<String, Object> param);
  •  

上面兩行代碼表示,當調用update方法時,該方法體會被執行,而且執行的結果會返回寫入到緩存中。

相關文章
相關標籤/搜索