Spring Cache 整合 Redis 實現(xiàn)高效緩存的方法
介紹
Spring Cache 是 Spring 框架提供的緩存抽象層,它簡化了在應用中添加緩存功能的過程,允許開發(fā)者通過注解方式輕松實現(xiàn)緩存邏輯,而無需關(guān)注具體的緩存實現(xiàn)細節(jié)。
- 緩存抽象:Spring Cache 不直接提供緩存實現(xiàn),而是定義了一套接口(如
Cache、CacheManager),支持多種緩存實現(xiàn)(如 Caffeine、EhCache、Redis 等)。 - 注解驅(qū)動:通過注解(如
@Cacheable、@CachePut、@CacheEvict)聲明緩存規(guī)則,無需手動編寫緩存邏輯。 - 透明集成:緩存操作與業(yè)務邏輯解耦,開發(fā)者只需關(guān)注業(yè)務代碼。
常用注解

@Cacheable
標記方法結(jié)果可被緩存。調(diào)用方法時,先檢查緩存:
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
// 從數(shù)據(jù)庫查詢用戶
return userRepository.findById(id);
}若緩存存在,直接返回緩存值,不執(zhí)行方法。
若緩存不存在,執(zhí)行方法并將結(jié)果存入緩存。
@CachePut
保證方法執(zhí)行,并將結(jié)果更新到緩存(常用于更新操作)。
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict
移除緩存條目(常用于刪除操作)。
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
@Caching
組合多個緩存注解(如同時更新和刪除緩存)。
@Caching(
put = @CachePut(value = "users", key = "#user.id"),
evict = @CacheEvict(value = "userList", allEntries = true)
)
public User saveUser(User user) {
return userRepository.save(user);
}
@CacheConfig
在類級別統(tǒng)一配置緩存屬性(如 value、keyGenerator),簡化方法上的注解。
案例
- 添加依賴(Maven):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>- 啟用緩存:
在啟動類添加@EnableCaching注解。
@SpringBootApplication
@EnableTransactionManagement //開啟注解方式的事務管理
@Slf4j
@EnableCaching//開啟緩存功能
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
log.info("server started");
}
}
- c端
/**
* 條件查詢
*
* @param categoryId
* @return
*/
@GetMapping("/list")
@ApiOperation("根據(jù)分類id查詢套餐")
@Cacheable(cacheNames = "setmealCache",key = "#categoryId")//key: setmealCache::categoryId
public Result<List<Setmeal>> list(Long categoryId) {
Setmeal setmeal = new Setmeal();
setmeal.setCategoryId(categoryId);
setmeal.setStatus(StatusConstant.ENABLE);
List<Setmeal> list = setmealService.list(setmeal);
return Result.success(list);
}
- 管理端
/**
* 新增套餐
* @param setmealDTO
* @return
*/
@PostMapping
@ApiOperation("新增套餐")
@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")
public Result save(@RequestBody SetmealDTO setmealDTO){
log.info("新增套餐:{}",setmealDTO);
setmealService.saveWithDish(setmealDTO);
return Result.success();
}
/**
* 刪除套餐
* @param ids
* @return
*/
@DeleteMapping
@ApiOperation("批量刪除套餐")
@CacheEvict(cacheNames = "setmealCache",allEntries = true)
public Result delete(@RequestParam List<Long> ids){
log.info("批量刪除套餐:{}",ids);
setmealService.deleteBatch(ids);
return Result.success();
}
/**
* 修改套餐起售停售狀態(tài)
* @param status
* @param id
* @return
*/
@PostMapping("/status/{status}")
@ApiOperation("修改套餐起售停售狀態(tài)")
@CacheEvict(cacheNames = "setmealCache",allEntries = true)
public Result startOrStop(@PathVariable("status") Integer status, Long id){
log.info("套餐起售或停售:{}",id);
setmealService.startOrStop(status,id);
return Result.success();
}注意事項
- 緩存鍵生成:默認使用方法參數(shù)生成鍵,可通過
key屬性自定義(SpEL 表達式),或配置KeyGenerator。 - 緩存穿透:可通過空值緩存(
@Cacheable(unless = "#result == null"))避免。 - 緩存更新:使用
@CachePut確保緩存與數(shù)據(jù)源一致性,避免直接修改緩存。 - 分布式緩存:在分布式系統(tǒng)中,推薦使用 Redis 等集中式緩存,避免本地緩存(如 Caffeine)的一致性問題。
通過 Spring Cache,開發(fā)者可以快速為應用添加緩存能力,提升系統(tǒng)性能,同時保持代碼簡潔易維護。
到此這篇關(guān)于Spring Cache 整合 Redis 實現(xiàn)高效緩存的文章就介紹到這了,更多相關(guān)Spring Cache Redis 高效緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Cache集成Redis做緩存的保姆級教程
- SpringBoot集成Redis及SpringCache緩存管理示例詳解
- SpringBoot詳解整合Spring?Cache實現(xiàn)Redis緩存流程
- Spring項目中使用Cache?Redis實現(xiàn)數(shù)據(jù)緩存
- 分布式醫(yī)療掛號系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存
- 詳解SpringBoot2.0的@Cacheable(Redis)緩存失效時間解決方案
- SpringBoot+SpringCache實現(xiàn)兩級緩存(Redis+Caffeine)
- Spring中緩存注解@Cache的使用詳解
相關(guān)文章
詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用
這篇文章主要介紹了詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
源碼解析Spring 數(shù)據(jù)庫異常抽理知識點總結(jié)
在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫異常抽理知識點內(nèi)容,對此有需要的朋友們學習參考下。2019-05-05
Spring?+?ECharts實現(xiàn)數(shù)據(jù)可視化的案例詳解
Apache?ECharts是一個基于?JavaScript?的開源可視化圖表庫,在網(wǎng)頁上實現(xiàn)數(shù)據(jù)的可視化,非常好用,本文將通過一個簡單的demo來給大家介紹一下Spring?+?ECharts如何數(shù)據(jù)可視化,需要的朋友可以參考下2023-07-07
Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換教程
這篇文章主要為大家介紹了Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換原理以及接收復雜嵌套對象參數(shù)與Http數(shù)據(jù)轉(zhuǎn)換的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03

