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 "";
}