当前位置:

首页 > 编程开发 > SpringBoot集成Redis缓存的实现方法策略

SpringBoot集成Redis缓存的实现方法策略

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

SpringBoot支持的缓存组件在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.CacheManager缓存管理器接口。如果程序中没有定义类型为CacheManager的Bean组件或者是名为cacheResolver的CacheResolver缓存解析器,SpringBoot将尝试选择启用以下缓存组件(按照指定的顺序):(1)Generic(2)JCa

本文目录

    SpringBoot支持的缓存组件

    在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.CacheManager缓存管理器接口。

    如果程序中没有定义类型为CacheManager的Bean组件或者是名为cacheResolver的CacheResolver缓存解析器,SpringBoot将尝试选择启用以下缓存组件(按照指定的顺序):

    (1)Generic

    (2)JCache (JSR-107) (EhCache 3、Hazelcast、Infinispan等)

    (3)EhCache 2.x

    (4)Hazelcast

    (5)Infinispan

    (6)Couchbase

    (7)Redis

    (8)Caffeine

    (9)Simple

    上面按照SpringBoot缓存组件的加载顺序,列举了SpringBoot支持的9种缓存组件,在项目中添加某个缓存管理组件(例如Redis)后,SpringBoot项目会选择并启用对应的缓存管理器。如果在项目中同时添加了多个缓存组件,且没有指定缓存管理器或者缓存解析器(CacheManager或者cacheResolver),那么SpringBoot会按照上述顺序在添加的多个缓存组件中优先启用排在前面的某个缓存组件进行缓存管理(例如,同时添加了Couchbase和Redis这两个缓存组件,那么优先启用Couchbase组件)。

    在上一篇文章 SpringBoot缓存管理(一) 默认缓存管理 介绍的默认缓存管理中,我们搭建的项目没有添加任何缓存管理组件,但是依旧实现了缓存管理。这是因为开启缓存管理后,SpringBoot会按照上述缓存组件顺序查找有效的缓存组件进行缓存管理,如果没有任何缓存组件,会默认使用最后一个Simple缓存组件进行管理。Simple缓存组件是SpringBoot默认的缓存管理组件,它默认使用内存中的ConcurrentMap进行缓存存储,所以在没有添加任何第三方缓存组件的情况下,依旧可以实现内存中的缓存管理,但是不推荐这种缓存管理方式。

    基于注解的Redis缓存实现

    在 SpringBoot缓存管理(一) 默认缓存管理 搭建的项目基础上引入Redis缓存组件,使用基于注解的方式讲解SpringBoot整合Redis缓存的具体实现。

    (1)添加Spring Data Redis依赖启动器

    在pom.xml文件中添加Spring Data Redis依赖启动器:

    
      org.springframework.boot
      spring-boot-starter-data-redis
    

    当我们添加Redis相关的依赖启动器后,SpringBoot会使用RedisCacheConfigratioin作为自动配置类进行缓存相关的自动装配类(之前为默认的SimpleCacheConfiguration),容器中使用的缓存管理器变为了RedisCacheManager(之前为默认为cacheManager),这个缓存管理器创建的Cache为RedisCache,进而操控Redis进行数据的缓存。

    (2)Redis服务器连接配置

    在项目的全局配置文件application.properties中添加Redis数据库的连接配置,示例代码如下:

    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=

    (3)对CommentService类中的方法进行修改

    使用@Cacheable、@CachePut、@CacheEvict三个注解进行缓存管理,分别进行缓存存储、缓存更新及缓存删除等操作:

    package com.hardy.springbootdatacache.service;
    
    import com.hardy.springbootdatacache.entity.Comment;
    import com.hardy.springbootdatacache.repository.CommentRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    
    /**
     * @Author: HardyYao
     * @Date: 2021/6/19
     */
    @Service
    public class CommentService {
    
        @Autowired
        private CommentRepository commentRepository;
    
        /**
         * 根据评论id查询评论
         * @Cacheable:将该方法的查询结果comment存放在SpringBoot默认缓存中
         * cacheNames:起一个缓存命名空间,对应缓存唯一标识
         * @param id
         * @return
         */
        @Cacheable(cacheNames = "comment", unless = "#result==null")
        public Comment findCommentById(Integer id){
            Optional comment = commentRepository.findById(id);
            if(comment.isPresent()){
                Comment comment1 = comment.get();
                return comment1;
            }
            return null;
        }
    
        /**
         * 更新评论
         * @param comment
         * @return
         */
        @CachePut(cacheNames = "comment",key = "#result.id")
        public Comment updateComment(Comment comment) {
            commentRepository.updateComment(comment.getAuthor(), comment.getaId());
            return comment;
        }
    
        /**
         * 删除评论
         * @param comment_id
         */
        @CacheEvict(cacheNames = "comment")
        public void deleteComment(int comment_id) {
            commentRepository.deleteById(comment_id);
        }
    
    }

    在上述代码中,使用了@Cacheable、@CachePut、@CacheEvict注解在数据查询、数据更新及数据删除方法上进行了缓存管理。

    其中,查询缓存@Cacheable注解中没有标记key值,将会使用默认参数值comment_id作为key进行数据保存,在进行缓存更新时必须使用同样的的key;同样,在使用查询缓存@Cacheable注解中,定义了 unless= "#result==null" 表示查询结果为空则不进行缓存。

    (4)在CommentController类中新增两个接口

    新增更新和删除的接口:

    package com.hardy.springbootdatacache.controller;
    
    import com.hardy.springbootdatacache.entity.Comment;
    import com.hardy.springbootdatacache.service.CommentService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author: HardyYao
     * @Date: 2021/6/19
     */
    @RestController
    public class CommentController {
    
        @Autowired
        private CommentService commentService;
    
        @RequestMapping(value = "/findCommentById")
        public Comment findCommentById(Integer id){
            Comment comment = commentService.findCommentById(id);
            return comment;
        }
    
        @RequestMapping(value = "/updateComment")
        public Comment updateComment(Comment comment){
            Comment oldComment = commentService.findCommentById(comment.getId());
            oldComment.setAuthor(comment.getAuthor());
            Comment comment1 = commentService.updateComment(oldComment);
            return comment1;
        }
    
        @RequestMapping(value = "/deleteComment")
        public void deleteComment(Integer id){
            commentService.deleteComment(id);
        }
    
    }

    (5)基于注解的Redis查询缓存测试

    在浏览器中输入:http://localhost:8080/findCommentById?id=1 进行访问:

    SpringBoot集成Redis缓存的实现方法策略

    页面报错了,查看控制台信息:

    SpringBoot集成Redis缓存的实现方法策略

    根据报错信息可知:查询用户评论信息Comment时执行了相应的SQL语句,但是在进行缓存存储时出现了IllegalArgumentException非法参数异常,提示信息要求对应的Comment实体类必须实现序列化(DefaultSerializer requires a Serializable payload but received an object of type [com.hardy.springbootdatacache.entity.Comment])。

    (6)将缓存对象实现序列化

    SpringBoot集成Redis缓存的实现方法策略

    (7)重启项目测试查询缓存

    在浏览器中输入:http://localhost:8080/findCommentById?id=1 进行访问(连续访问三次):

    SpringBoot集成Redis缓存的实现方法策略SpringBoot集成Redis缓存的实现方法策略

    打开Redis客户端可视化工具Redis Desktop Manager,连接本地启用的Redis服务,查看具体的数据缓存效果:

    SpringBoot集成Redis缓存的实现方法策略

    执行findById()方法查询出的用户评论信息Comment正确存储到了Redis缓存库中名为comment的名称空间下。

    其中缓存数据的唯一标识key值是以“名称空间comment::+参数值(comment::1)”的字符串形式体现的,而value值则是经过JDK默认序列格式化后的HEX格式存储。这种JDK默认序列格式化后的数据显然不方便缓存数据的可视化查看和管理,所以在实际开发中,通常会自定义数据的序列化格式,这方面的内容在后面会介绍。

    (8)基于注解的Redis缓存更新测试

    先通过浏览器访问:http://localhost:8080/updateComment?id=1&author=hardy;

    接着在访问:http://localhost:8080/findCommentById?id=1,查看浏览器返回信息及控制台打印信息:

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    可以看到,执行updateComment()更新id为1的数据时执行了一条更新的SQL语句,后续调用findById()方法查询id为1的用户评论信息时没有再次执行查询的SQL语句,且浏览器返回了更新后的正确结果,这说明@CachePut缓存更新配置成功。

    (9)基于注解的Redis缓存删除测试

    通过浏览器访问:http://localhost:8080/deleteComment?id=1 和 http://localhost:8080/findCommentById?id=1

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    执行deleteComment()方法删除id为1的数据后查询结果为空,查看Redis缓存数据库:

    SpringBoot集成Redis缓存的实现方法策略

    可以看到之前存储的comment相关数据被删除掉了,这表明@CacheEvict注解缓存删除成功实现。

    通过上面的案例可以看出:使用基于注解的Redis缓存实现只需要添加Redis依赖、并使用几个注解在对应的方法上,就可以实现对数据的缓存管理。

    另外,还可以在SpringBoot全局配置文件中配置Redis有效期,示例代码如下:

    # 对基于注解的Redis缓存数据统一设置有效期为1分钟,单位毫秒
    spring.cache.redis.time-to-live=60000

    上述代码中,在SpringBoot全局配置文件中添加了“spring.cache.redis.time-to-live”属性统一设置Redis数据的有效期(单位为毫秒),但这种方式不够灵活,因此一般不用。

    基于API的Redis缓存实现

    在SpringBoot整合Redis缓存实现中,除了基于注解形式的Redis缓存形式外,还有一种开发中更常用的方式——基于API的Redis缓存实现。这种基于API的Redis缓存实现,需要在某种业务需求下通过Redis提供的API调用相关方法实现数据缓存管理。同时,这种方法还可以手动管理缓存的有效期。

    下面,通过Redis API的方式讲解SpringBoot整合Redis缓存的具体实现。

    (1)使用Redis API进行业务数据缓存管理

    在 com.hardy.springbootdatacache.service 包下新建一个 ApiCommentService:

    package com.hardy.springbootdatacache.service;
    
    import com.hardy.springbootdatacache.entity.Comment;
    import com.hardy.springbootdatacache.repository.CommentRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.CachePut;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @Author: HardyYao
     * @Date: 2021/6/19
     */
    @Service
    public class ApiCommentService {
    
        @Autowired
        private CommentRepository commentRepository;
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        /**
         * 根据评论id查询评论
         * @param id
         * @return
         */
        public Comment findCommentById(Integer id){
            // 先查Redis缓存
            Object o = redisTemplate.opsForValue().get("comment_" + id);
            if (o != null) {
                return (Comment) o;
            } else {
                // 如果缓存中没有,则从数据库查询
                Optional dbComment = commentRepository.findById(id);
                if (dbComment.isPresent()) {
                    Comment redisComment = dbComment.get();
                    // 将查询结果存储到缓存中,并设置有效期为1天
                    redisTemplate.opsForValue().set("comment_"+id, redisComment,1, TimeUnit.DAYS);
                    return redisComment;
                } else {
                    return null;
                }
            }
    
        }
    
        /**
         * 更新评论
         * @param comment
         * @return
         */
        public Comment updateComment(Comment comment) {
            commentRepository.updateComment(comment.getAuthor(), comment.getId());
            // 更新数据库数据后进行缓存更新
            redisTemplate.opsForValue().set("comment_" + comment.getId(), comment);
            return comment;
        }
    
        /**
         * 删除评论
         * @param comment_id
         */
        public void deleteComment(int comment_id) {
            commentRepository.deleteById(comment_id);
            // 删除数据库数据后进行缓存删除
            redisTemplate.delete("comment_" + comment_id);
        }
    
    }

    (2)编写Web访问层ApiCommentController

    package com.hardy.springbootdatacache.controller;
    
    import com.hardy.springbootdatacache.entity.Comment;
    import com.hardy.springbootdatacache.service.ApiCommentService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author: HardyYao
     * @Date: 2021/6/19
     */
    @RestController
    @RequestMapping("api")  // 改变请求路径
    public class ApiCommentController {
    
        @Autowired
        private ApiCommentService apiCommentService;
    
        @RequestMapping(value = "/findCommentById")
        public Comment findCommentById(Integer id){
            Comment comment = apiCommentService.findCommentById(id);
            return comment;
        }
    
        @RequestMapping(value = "/updateComment")
        public Comment updateComment(Comment comment){
            Comment oldComment = apiCommentService.findCommentById(comment.getId());
            oldComment.setAuthor(comment.getAuthor());
            Comment comment1 = apiCommentService.updateComment(oldComment);
            return comment1;
        }
    
        @RequestMapping(value = "/deleteComment")
        public void deleteComment(Integer id){
            apiCommentService.deleteComment(id);
        }
    
    }

    (3)测试基于API的Redis缓存实现

    输入:http://localhost:8080/api/findCommentById?id=2(连续输入三次)、http://localhost:8080/api/updateComment?id=2&author=hardy、http://localhost:8080/deleteComment?id=2进行访问:

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    查看控制台消息及Redis数据库:

    SpringBoot集成Redis缓存的实现方法策略

    SpringBoot集成Redis缓存的实现方法策略

    基于API的Redis缓存实现的相关配置:基于API的Redis缓存实现不需要@EnableCaching注解开启基于注解的缓存支持,所以这里可以选择将添加在项目启动类上的@EnableCaching注解进行删除或者注释,不会影响项目的功能实现。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】
    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】

    C++结构体无法直接序列化为RESP协议,需手动将字段映射为*N数组嵌套$lenbulkstring形式。整数需转换为字符串并加:前缀,空字符串用$0\r\n,null用$-1\r\n。长度计算需精确到字节数,特别注意二进制安全,同时确保字段顺序与结构体定义一致。

    如何在Golang架构中部署Redict作为高能数据临时存储中转站
    如何在Golang架构中部署Redict作为高能数据临时存储中转站

    Redis作为跨服务临时状态枢纽,需按消息队列、缓存和原子状态三重角色设计。选型用List实现任务分发及延迟重试,Stream用于事件广播与位点回溯。go-redis/v8需配置MinIdleConns、MaxRetries及超时。数据写入应JSON序列化并带type标签、设合理TTL、将关键字段提至顶层。消费通过原子GET+DEL或processedkey

    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制
    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制

    在高并发秒杀场景下,利用Redis的减库存原子操作预扣减库存拦截超卖请求,再通过数据库乐观锁(版本号与库存校验)确保最终一致性,异常时回滚Redis库存并借助Lua脚本保证原子性,从而有效防止库存超卖。

    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑
    如何在 Go 中利用 go-redis 执行 Lua 脚本优化逻辑

    在Go中使用go-redis执行Lua脚本可借助原子性解决竞态问题,通过redis.Script封装脚本并自动处理SHA1缓存与重试。需注意KEYS必须为非空切片且所有键在Cluster模式下落在同一slot,ARGV以字符串传入并由tonumber转换。返回值需先检查错误再调用Val(),避免panic。

    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】
    TP6.0 基于 Redis SetNX 实现的简单互斥锁机制【并发】

    先看一个典型场景:电商秒杀、库存扣减、定时任务重复调度——这些并发冲突在 TP6 应用里屡见不鲜。用 Redis 的 SETNX 做互斥锁,确实是轻量又直接的方案,但“能用”和“稳妥”之间,隔着三层硬功夫:原子加锁、身份校验、合理超时。这三条,差一条就翻车。 很多人第一次上手,直接写 SETNX 加

    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】
    TP6.0 如何处理高并发抢购?Redis 原子锁与队列削峰详解【秒杀】

    高并发抢购中,Redis的DECR原子操作可安全扣库存;配合think-queue异步削峰,接口仅扣库存和推消息;分布式锁需用SETNXEX加唯一标识,释放时用Lua脚本校验;成功资格后须以数据库事务双写为准,失败时补回Redis库存。

    Golang 实现基于 Redis 的延时任务队列
    Golang 实现基于 Redis 的延时任务队列

    基于Redis的ZSET实现延时队列需解决并发重复消费、失败重试混乱、精度不足及内存爆炸等问题。通过Lua脚本保证取删原子性,使用毫秒级时间戳,对临时错误采用指数退避重试,永久错误记入独立哈希表,并限制最大延迟、定期清理过期任务、使用紧凑序列化格式。

    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】
    RedisInsight怎么修改Key的过期时间 Redis操作方法【步骤】

    操作 Redis 的时候,改个 Key 的过期时间其实是个高频场景。特别是做运维排查或者临时调试那会儿,谁也不想反复切命令行窗口、背那些命令参数。好在 RedisInsight 这个图形工具把这事儿做得很顺手——三种方式任选,总有一种合你胃口。 在动手前,先确认一下 Key 当前的 TTL 状态是个

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?