Spring boot (三) —— spring 緩存

Spring boot (三) —— spring 緩存

關於spring緩存如何操作

  1. 添加cache依賴

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

  1. 在啓動類配置:@EnableCaching
  2. 然後在接口方法實現處添加緩存註解
  3. 緩存之後,程序調用該類實例的任何方法,只要傳入的參數相同,Spring將不會真正執行該方法,而是直接根據傳入的參數去查找緩存中的數據

關於緩存註解

@Cacheable

主要針對方法配置,能夠根據方法的請求參數對其進行緩存

@CacheEvict

清空緩存

@CachePut

保證方法被調用,又希望結果被緩存。
與@Cacheable區別在於是否每次都調用方法,常用於更新

@CacheConfig

這個註解的的主要作用就是全局配置緩存,比如配置緩存的名字(cacheNames),只需要在類上配置一次,下面的方法就默認以全局配置爲主,不需要二次配置,節省了部分代碼。

這是會用到的四種註解,其中前三種註解的主要參數解釋如下:

value

緩存的名稱,在 spring 配置文件中定義,必須指定至少一個,其實就是緩存空間名,假如你在CacheConfig上填了,就可以不填
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}

key

緩存的 key,可以爲空,如果指定要按照 SpEL 表達式編寫,
如果不指定,則缺省按照方法的所有參數進行組合
例如:
@Cacheable(value=”testcache”,key=”#id”)

condition

緩存的條件,可以爲空,使用 SpEL 編寫,返回 true 或者 false,
只有爲 true 才進行緩存/清除緩存
例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)

unless

否定緩存。當條件結果爲TRUE時,就不會緩存。
@Cacheable(value=”testcache”,unless=”#userName.length()>2”)

allEntries
(@CacheEvict )

是否清空所有緩存內容,缺省爲 false,如果指定爲 true,
則方法調用後將立即清空所有緩存
例如:
@CachEvict(value=”testcache”,allEntries=true)

beforeInvocation
(@CacheEvict)

是否在方法執行前就清空,缺省爲 false,如果指定爲 true,
則在方法還沒有執行的時候就清空緩存,缺省情況下,如果方法
執行拋出異常,則不會清空緩存
例如:
@CachEvict(value=”testcache”,beforeInvocation=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層進行方法的緩存註解。

緩存是優化項目的一個重要手段,所以今天介紹一種簡單的緩存手段,侷限性也很明顯,就是不夠靈活,但對於一些小項目而言是足夠了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章