Spring boot (三) —— spring 緩存
關於spring緩存如何操作
- 添加cache依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
- 在啓動類配置:@EnableCaching
- 然後在接口方法實現處添加緩存註解
- 緩存之後,程序調用該類實例的任何方法,只要傳入的參數相同,Spring將不會真正執行該方法,而是直接根據傳入的參數去查找緩存中的數據
關於緩存註解
@Cacheable |
主要針對方法配置,能夠根據方法的請求參數對其進行緩存 |
@CacheEvict |
清空緩存 |
@CachePut |
保證方法被調用,又希望結果被緩存。 |
@CacheConfig |
這個註解的的主要作用就是全局配置緩存,比如配置緩存的名字(cacheNames),只需要在類上配置一次,下面的方法就默認以全局配置爲主,不需要二次配置,節省了部分代碼。 |
這是會用到的四種註解,其中前三種註解的主要參數解釋如下:
value |
緩存的名稱,在 spring 配置文件中定義,必須指定至少一個,其實就是緩存空間名,假如你在CacheConfig上填了,就可以不填 |
key |
緩存的 key,可以爲空,如果指定要按照 SpEL 表達式編寫, |
condition |
緩存的條件,可以爲空,使用 SpEL 編寫,返回 true 或者 false, |
unless |
否定緩存。當條件結果爲TRUE時,就不會緩存。 |
allEntries |
是否清空所有緩存內容,缺省爲 false,如果指定爲 true, |
beforeInvocation |
是否在方法執行前就清空,缺省爲 false,如果指定爲 true, |
這個緩存註解是通過識別key來確定是否要調用緩存的,而這個key一般由我們動態設置,多數是通過傳進來的某個參數(如id)。
舉個例子:
實體層:
@Entity
@Table(name = "Tester")
public class Tester {
@Id
@SequenceGenerator(name = "generator_Tester", sequenceName = "s_Tester", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator_Tester")
@Column(name = "id")
private Long id;
private String name;
private String value1;
private String value2;
private Integer age;
}
Service層:
@Service
@CacheConfig(cacheNames = {"myCache"})
//將本類的所有緩存註解的value命名爲myCache
public class TestService {
@Autowired
private TesterRepository testerRepository;
@Cacheable(key = "#age")
public List<Tester> GetAll(Integer age){
try {
//模擬耗時操作
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return testerRepository.findAllByAge(age);
}
@CacheEvict(key = "#tester.age")
public List<Tester> Create(Tester tester){
Tester tester1 = new Tester(tester.getName(),tester.getValue1(),tester.getValue2(),tester.getAge());
testerRepository.save(tester1);
List<Tester> testerList = testerRepository.findAll();
return testerList;
}
@CacheEvict(allEntries = true)
public List<Tester> Delete(Tester tester){
testerRepository.delete(tester.getId());
List<Tester> testerList = testerRepository.findAll();
return testerList;
}
}
Controller層:
@RestController
@RequestMapping("/test")
public class TesterController {
@Autowired TestService testService;
@GetMapping("/getall")
public List<Tester> getAll(@RequestParam("age") Integer age){
if (age == null)
return null;
Long start = System.currentTimeMillis();
List<Tester> testerList = testService.GetAll(age);
Long end = System.currentTimeMillis();
System.out.println("--執行數據庫查詢操作"+(end - start));
return testerList;
}
@PostMapping("/create")
public List<Tester> createOne(@RequestBody Tester tester){
if (tester == null){
return null;
}
return testService.Create(tester);
}
@PostMapping("/delete")
public List<Tester> deleOne(@RequestBody Tester tester){
if (tester == null){
return null;
}
return testService.Delete(tester);
}
}
在這個例子中,我們就實現了對按照age查詢的結果進行緩存,並在對應age的數據發生更新或刪除後清除緩存的操作,要點是在service層進行方法的緩存註解。
緩存是優化項目的一個重要手段,所以今天介紹一種簡單的緩存手段,侷限性也很明顯,就是不夠靈活,但對於一些小項目而言是足夠了。