Spring Cache 整合 Redis 实现高效缓存的方法

 更新时间:2025年08月21日 10:00:14   作者:跟着豪哥学Java  
SpringCache是Spring框架的缓存抽象层,通过注解简化缓存逻辑,支持Caffeine、EhCache、Redis等实现,接下来通过本文给大家介绍Spring Cache整合Redis实现高效缓存的方法,感兴趣的朋友跟随小编一起看看吧

介绍

Spring Cache 是 Spring 框架提供的缓存抽象层,它简化了在应用中添加缓存功能的过程,允许开发者通过注解方式轻松实现缓存逻辑,而无需关注具体的缓存实现细节。

  1. 缓存抽象:Spring Cache 不直接提供缓存实现,而是定义了一套接口(如 CacheCacheManager),支持多种缓存实现(如 Caffeine、EhCache、Redis 等)。
  2. 注解驱动:通过注解(如 @Cacheable@CachePut@CacheEvict)声明缓存规则,无需手动编写缓存逻辑。
  3. 透明集成:缓存操作与业务逻辑解耦,开发者只需关注业务代码。

常用注解

@Cacheable
标记方法结果可被缓存。调用方法时,先检查缓存:

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 从数据库查询用户
    return userRepository.findById(id);
}

若缓存存在,直接返回缓存值,不执行方法。

若缓存不存在,执行方法并将结果存入缓存。

@CachePut
保证方法执行,并将结果更新到缓存(常用于更新操作)。

@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
在类级别统一配置缓存属性(如 valuekeyGenerator),简化方法上的注解。

案例

  • 添加依赖(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("根据分类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();
    }
    /**
     * 修改套餐起售停售状态
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("修改套餐起售停售状态")
    @CacheEvict(cacheNames = "setmealCache",allEntries = true)
    public Result startOrStop(@PathVariable("status") Integer status, Long id){
        log.info("套餐起售或停售:{}",id);
        setmealService.startOrStop(status,id);
        return Result.success();
    }

注意事项

  • 缓存键生成:默认使用方法参数生成键,可通过 key 属性自定义(SpEL 表达式),或配置 KeyGenerator
  • 缓存穿透:可通过空值缓存(@Cacheable(unless = "#result == null"))避免。
  • 缓存更新:使用 @CachePut 确保缓存与数据源一致性,避免直接修改缓存。
  • 分布式缓存:在分布式系统中,推荐使用 Redis 等集中式缓存,避免本地缓存(如 Caffeine)的一致性问题。

通过 Spring Cache,开发者可以快速为应用添加缓存能力,提升系统性能,同时保持代码简洁易维护。

到此这篇关于Spring Cache 整合 Redis 实现高效缓存的文章就介绍到这了,更多相关Spring Cache Redis 高效缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何Mock FileInputStream问题

    Java如何Mock FileInputStream问题

    这篇文章主要介绍了Java如何Mock FileInputStream问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • JDK安装与配置超级详细教程(包含二个或多个JDK的同时安装)

    JDK安装与配置超级详细教程(包含二个或多个JDK的同时安装)

    这篇文章主要给大家介绍了关于JDK安装与配置(包含二个或多个JDK的同时安装)的相关资料,对于Java学习者来说,一台电脑拿到手肯定要配置JDK,但是对于新手来说还是容易出错,需要的朋友可以参考下
    2023-10-10
  • 微服务中使用Maven BOM来管理你的版本依赖详解

    微服务中使用Maven BOM来管理你的版本依赖详解

    这篇文章主要介绍了微服务中使用Maven BOM来管理你的版本依赖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • java返回前端树形结构数据的2种实现方式

    java返回前端树形结构数据的2种实现方式

    近期项目有个需求,需要将组织机构数据拼成树型结构返回至前端,下面这篇文章主要给大家介绍了关于java返回前端树形结构数据的2种实现方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • SpringBoot框架整合SwaggerUI的示例代码

    SpringBoot框架整合SwaggerUI的示例代码

    项目中使用了很多现成的框架,都是项目经理、架构师带来的,从来没有自己整合过,今天给大家介绍下SpringBoot框架整合SwaggerUI的过程,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Java Socket编程详解及示例代码

    Java Socket编程详解及示例代码

    本文主要讲解Java Socket编程,这里整理了详细的技术资料及简单的示例代码帮助大家学习参考,有需要的小伙伴可以参考下本文内容
    2016-09-09
  • 模拟Mybatis的实现方法

    模拟Mybatis的实现方法

    本文通过实例代码给大家分享了模拟Mybatis的实现方法,需要的朋友参考下吧
    2017-09-09
  • java向上转型与向下转型详解

    java向上转型与向下转型详解

    这篇文章主要为大家详细介绍了java向上转型与向下转型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java使用WebFlux调用大模型实现智能对话

    Java使用WebFlux调用大模型实现智能对话

    这篇文章主要为大家详细介绍了Java如何使用WebFlux调用大模型实现智能对话效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-06-06
  • idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    这篇文章主要介绍了java之idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论