SpringCache之 @CachePut的使用

使用CachePut註解,該方法每次都會執行,會清除對應的key值得緩存(或者更新),

分為以下兩種情況:

如果返回值null,下次進行該key值查詢時,還會查一次數據庫,此時相當於@CacheEvict註解;

如果返回值不為null,此時會進行該key值緩存的更新,更新緩存值為返回的數據;

分析:情況一返回值為null:

//使用Redis緩存
  @Cacheable(value="Manager",key="#id")
  public User findById(Integer id) {
    System.out.println("---查數據庫DB-----");
    return userMapper.selectByPrimaryKey(id);
  }
 
  @CachePut(value="Manager",key="#manager.getId()")
  //@CacheEvict(value="Manager",key="#manager.getId()")//清除數據
  public User update(User manager) {
    userMapper.updateByPrimaryKeySelective(manager);
    //return userMapper.selectByPrimaryKey(manager.getId());
    return null;
  }

情況二返回值不為null: 

先進行數據id為1的查詢,發現下次查詢id為1的數據不會再查詢DB,直接走緩存;

此時進行id為1數據更新操作,並且返回值為null;

進行id為1的數據查詢,發現此時id為1緩存不存在,進行DB查詢;

 //使用Redis緩存
  @Cacheable(value="Manager",key="#id")
  public User findById(Integer id) {
    System.out.println("---查數據庫DB-----");
    return userMapper.selectByPrimaryKey(id);
  }
 
  @CachePut(value="Manager",key="#manager.getId()")
  //@CacheEvict(value="Manager",key="#manager.getId()")//清除數據
  public User update(User manager) {
    userMapper.updateByPrimaryKeySelective(manager);
    return userMapper.selectByPrimaryKey(manager.getId());
    //return null;
  }

先進行數據id為1的查詢,發現下次查詢id為1的數據不會再查詢DB,直接走緩存;

此時進行id為1數據更新操作,返回值不為null;

進行id為1的數據查詢,發現此時id為1緩存被更新為更新的數據,且沒有進行DB查詢操作;

補充:@CachePut和@Cacheable的區別

@CachePut負責增加緩存

@Cacheable負責查詢緩存,如果沒查到,則將執行方法,並將方法的結果增加到緩存

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。