1. 功能說明
當需要在不影響方法執行的情況下更新緩存時,可以使用 @CachePut,也就是說,被 @CachePut 注解的緩存方法總是會執行,而且會嘗試將結果放入緩存(當然,是否真的會緩存還跟一些注解參數有關,比如:unless 參數)。@CachePut 跟 @Cacheable 有相同的參數屬性(但是沒有 sync 屬性)。@CachePut 更加適合於緩存填充,而不是方法執行流的優化。
由於與 @Cacheable 的屬性基本相同,所以不再重復示例。這里重點說明一下它們的區別:
@Cacheable 的邏輯是:查找緩存 - 有就返回 -沒有就執行方法體 - 將結果緩存起來;
@CachePut 的邏輯是:執行方法體 - 將結果緩存起來;
所以 @Cacheable 適用於查詢數據的方法,@CachePut 適用於更新數據的方法。
有關 @Cacheable 的使用,請參考:spring cache 學習——@Cacheable 使用詳解
2. 下面舉一個例子
編寫一個查詢方法,使用 @Cacheable :
@Override @Cacheable(value = {"menuById"}, key = "#id") public Menu findById(String id) { Menu menu = this.getById(id); if (menu != null){ System.out.println("menu.name = " + menu.getName()); } return menu; }
再編寫一個更新方法,使用 @CachePut :
@Override @CachePut(value = "menuById", key = "#menu.id") public Menu ReviseById(Menu menu) { this.updateById(menu); return menu; }
請求一遍查詢方法,結果在緩存中生成了數據:
然后請求一遍更新方法,提交的數據如下:
再看看緩存中的數據,已經修改了:
這就是 @CachePut 的作用了。
另外說一下:官方強烈不推薦將 @Cacheable 和 @CachePut 注解到同一個方法。