springboot中數據使用緩存操作

在service層配置緩存

查詢
更新
刪除
複雜條件

@CacheConfig
@CacheConfig(cacheNames="emp"/*,cacheManager = "employeeCacheManager"*/) //抽取緩存的公共配置

查詢:

@Cacheable
@Cacheable標註的方法執行之前先來檢查緩存中有沒有這個數據,默認按照參數的值作爲key去查詢緩存,如果沒有就運行方法並將結果放入緩存;以後再來調用就可以直接使用緩存中的數據;

參數:
cacheNames/value:指定緩存組件的名字;將方法的返回結果放在哪個緩存中,是數組的方式,可以指定多個緩存;
key:緩存數據使用的key;可以用它來指定。默認是使用方法參數的值 1-方法的返回值 編寫SpEL; #i d;參數id的值 #a0 #p0 #root.args[0] getEmp[2]
keyGenerator:key的生成器;可以自己指定key的生成器的組件id
key/keyGenerator:二選一使用;
cacheManager:指定緩存管理器;或者cacheResolver指定獲取解析器
condition:指定符合條件的情況下才緩存;
condition = “#id>0”
condition = “#a0>1”:第一個參數的值》1的時候才進行緩存
unless:否定緩存;當unless指定的條件爲true,方法的返回值就不會被緩存;可以獲取到結果進行判斷
unless = “#result == null”
unless = “#a0==2”:如果第一個參數的值是2,結果不緩存;
代碼演示:

    @Cacheable(value = {"emp"})
    public Employee getEmp(Integer id){
        System.out.println("查詢"+id+"號員工");
        Employee emp = employeeMapper.getEmpById(id);
        return emp;
    }

更新:

@CachePut:

@CachePut:既調用方法,又更新緩存數據;同步更新緩存
修改了數據庫的某個數據,同時更新緩存;
運行時機:

  • 1、先調用目標方法
  • 2、將目標方法的結果緩存起來

注意事項:
1、查詢1號員工;查到的結果會放在緩存中;
* key:1 value:lastName:張三
2、以後查詢還是之前的結果
3、更新1號員工;【lastName:zhangsan;gender:0】將方法的返回值也放進緩存了;
* key:傳入的employee對象 值:返回的employee對象;
4、查詢1號員工?

  • 應該是更新後的員工;
    爲什麼是沒更新前的?【1號員工沒有在緩存中更新】

key = “#employee.id”:使用傳入的參數的員工id;
key = “#result.id”:使用返回後的id
@Cacheable的key是不能用#result
代碼演示:

    @CachePut(/*value = "emp",*/key = "#result.id")
    public Employee updateEmp(Employee employee){
        System.out.println("updateEmp:"+employee);
        employeeMapper.updateEmp(employee);
        return employee;
    }

刪除:

@CacheEvict
 * @CacheEvict:緩存清除
 *  key:指定要清除的數據
 *  allEntries = true:指定清除這個緩存中所有的數據
 *  beforeInvocation = false:緩存的清除是否在方法之前執行
 *      默認代表緩存清除操作是在方法執行之後執行;如果出現異常緩存就不會清除
 *
 *  beforeInvocation = true:
 *      代表清除緩存操作是在方法運行之前執行,無論方法是否出現異常,緩存都清除
 *
 *
 */
@CacheEvict(value="emp",beforeInvocation = true/*key = "#id",*/)
    public void deleteEmp(Integer id){
        System.out.println("deleteEmp:"+id);
        //employeeMapper.deleteEmpById(id);
        int i = 10/0;
    }

複雜:

@Caching
@Caching 定義複雜的緩存規則
 @Caching(
         cacheable = {
             @Cacheable(/*value="emp",*/key = "#lastName")
         },
         put = {
             @CachePut(/*value="emp",*/key = "#result.id"),
             @CachePut(/*value="emp",*/key = "#result.email")
         }
    )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章