@Cacheable、@CachePut和@CacheEvict三個(gè)注解的使用及區(qū)別
在 Spring 框架中,@Cacheable、@CachePut 和 @CacheEvict 是三個(gè)與緩存管理相關(guān)的核心注解,它們與 Redis 等緩存中間件結(jié)合使用時(shí),可以顯著提升應(yīng)用性能。
以下是它們的核心區(qū)別和適用場景:
@Cacheable
作用:
在方法執(zhí)行前檢查緩存,如果緩存中存在對應(yīng)結(jié)果,直接返回緩存值,跳過方法執(zhí)行;若不存在,則執(zhí)行方法并將返回值存入緩存。
適用場景:
- 查詢操作(例如根據(jù) ID 查詢用戶信息)。
- 適用于結(jié)果穩(wěn)定、不頻繁變更的數(shù)據(jù)。
關(guān)鍵參數(shù):
value/cacheNames:緩存名稱(如"users")。key:緩存的鍵(支持 SpEL 表達(dá)式)。condition/unless:緩存條件(如condition="#id > 10")。
示例:
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 查詢數(shù)據(jù)庫
return userRepository.findById(id);
}@CachePut
作用:
無論緩存是否存在,始終執(zhí)行方法,并將返回值更新到緩存中。適用于需要強(qiáng)制刷新緩存的場景。
適用場景:
- 更新操作(例如修改用戶信息后同步更新緩存)。
- 需要確保緩存與數(shù)據(jù)庫數(shù)據(jù)一致。
關(guān)鍵參數(shù):
與 @Cacheable 相同,但需確保 key 的生成邏輯與 @Cacheable 一致,否則可能導(dǎo)致緩存不一致。
示例:
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
// 更新數(shù)據(jù)庫
userRepository.update(user);
return user; // 更新后的結(jié)果存入緩存
}@CacheEvict
作用:
刪除指定緩存條目或清空整個(gè)緩存。支持在方法調(diào)用前或后觸發(fā)。
適用場景:
- 刪除操作(例如刪除用戶后清除緩存)。
- 數(shù)據(jù)變更后需要清理舊緩存(如批量更新后清空列表緩存)。
關(guān)鍵參數(shù):
allEntries:是否清空整個(gè)緩存(默認(rèn)為false,僅刪除key對應(yīng)的條目)。beforeInvocation:是否在方法執(zhí)行前刪除緩存(默認(rèn)為false,方法執(zhí)行后刪除)。
示例:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
// 清空整個(gè)緩存
@CacheEvict(value = "users", allEntries = true)
public void refreshAllUsers() {
// 無需實(shí)際邏輯,僅觸發(fā)緩存清理
}三者的核心區(qū)別
| 注解 | 是否執(zhí)行方法體 | 緩存行為 | 典型場景 |
|---|---|---|---|
| @Cacheable | 緩存命中時(shí)跳過 | 讀取緩存或?qū)懭胄陆Y(jié)果 | 查詢(冪等操作) |
| @CachePut | 始終執(zhí)行 | 強(qiáng)制更新緩存 | 更新(非冪等) |
| @CacheEvict | 通常執(zhí)行 | 刪除緩存條目或清空整個(gè)緩存 | 刪除或清理緩存 |
注意事項(xiàng)
鍵的一致性
@Cacheable 和 @CachePut 的 key 生成邏輯必須一致,否則更新后可能無法覆蓋舊緩存。
事務(wù)與緩存的順序
默認(rèn)情況下,緩存操作在方法執(zhí)行后觸發(fā)。若方法有事務(wù),需確保緩存操作在事務(wù)提交后執(zhí)行(可通過 @Transactional 配置)。
條件過濾
使用 condition 和 unless 避免緩存無效數(shù)據(jù)(如 unless="#result == null")。
分布式鎖
在高并發(fā)場景下,結(jié)合分布式鎖(如 Redis 的 RedLock)避免緩存擊穿或雪崩。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)Html保存為.mhtml文件的代碼邏輯
文章介紹了實(shí)現(xiàn)將HTML字符串保存為.mhtml文件的代碼邏輯,包括通過URL和Cookie免密獲取HTML字符串,將HTML中的圖片、CSS、JS轉(zhuǎn)換為base64字符串,刪除不需要的布局和內(nèi)容,最終將替換后的HTML保存為.mhtml文件,感興趣的朋友跟隨小編一起看看吧2026-01-01
基于Java實(shí)現(xiàn)抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于Java實(shí)現(xiàn)抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
SpringSecurity實(shí)現(xiàn)自定義登錄接口的詳細(xì)過程
本文詳細(xì)介紹了如何使用SpringSecurity實(shí)現(xiàn)自定義登錄接口,文章還涉及了對用戶實(shí)體類的增強(qiáng)以滿足詳細(xì)信息的需求,適合需要深入了解和實(shí)現(xiàn)SpringSecurity自定義登錄功能的開發(fā)者,感興趣的朋友跟隨小編一起看看吧2024-10-10

