Spring Boot 整合 Redis 实现数据缓存案例详解

2025-05-23 02:50

本文主要是介绍Spring Boot 整合 Redis 实现数据缓存案例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB...

Spring Boot 缓存,默认使用的是 ConcurrentMap 的方式来实现的,然而我们在项目中并不会这么使用。我们经常会引入第三方缓存框架,来完成对数据的缓存操作。比如说:Redis 。本文就来介绍 Spring Boot 整合 Redis 来实现数据的缓存。

1.添加 Maven 依赖

<!--引入 redis starter 的maven依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置redis属性

spring.redis.host=192.168.2php04.211
spring.redis.port=6379
spring.redis.password=xxx
spring.redis.database=0
# 设置连接池配置等(如有需要)
spring.redis.lettuce.pool.max-active=xxx
spring.redis.lettuce.pool.max-idle=xxx

配置好 redis 相关属性之后,Spring Boot 在项目启动时,便会自动为我们注入 redisTemplate、stringRedisTemplate 组件。因为我们操作缓存大多数都是对字符串进行操作。所以为我们专门抽取出来的一个 stringRedisTemplate 组件,方便我们的使用。

3.创建 redisCacheManager

引入 redis 来实现缓存,此时我们便使用 RedisCacheManager 来进行管理了。我们在使用 RedisCacheManager 来操作 redis 时,底层操作默认使用的是 RedisTemplate,而 redisTemplate 是 redisAutoConfiguration 在项目启动时帮我们自动注册的组件,它默认使用的是 JDK 序列化机制。所以在 redis 存储时,会出现类似乱码的情况出现。所以我们需要来自己配置 redisCacheManager。

Spring Boot 整合 Redis 实现数据缓存案例详解

新建一个配置类 MyRedisConfig.Java,使用@Configuration 注解来标注该类是一个配置类。然后使用 @Bean 注解为 IOC 容器注册我们自定义的 redisCacheManager,代码如下所示:

import com.fasterXML.jackson.annotation.jsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
 * 自定义 Redis缓存相关配置
 */
@EnableCaching
@Configuration
public class MyRedisConfig {
    /**
     * 自定义CacheManager管理器
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory){
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//这一句必须要,作用是序列化时将对象全类名一起保存下来
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //配置序列化(解决乱码的问题)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(300))//设置 key 过期时间
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) //设置key序列化规则
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSeriawww.chinasem.cnlizer))//设置value序列化规则
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(config)
                .build();
        China编程return cacheManager;
    }
}

4.使用Spring提供的注解,实现缓存数据到 Redis

使用 @Cacheable@CachePut@CacheEvict 等注解来实现缓存功能,此处不再过多介绍,可参考:Spring 缓存在项目中的使用。测试图如下所示:

Spring Boot 整合 Redis 实现数据缓存案例详解

5.完成对操作过程中数据的缓存

使用 @Cacheable 等注解,都是将最终的结果进行缓存。如果我们需要对过程中的部分数据也进行缓存,我们此时就需要使用 RedisCacheManager 来手动操作。

/**
 * 如果有多个cacheManager,也可以来手动指定使用哪个
 */
@Override
@Cacheable(value = "user", key = "#root.methodName +'['+ #id +']'",cacheManager = "redisCacheManager")
public User getUser(Integer id) {
    log.info("用户"+id+"开始执行数据库查询");
    User user =  userMapper.getUser(id);   
    return user;
}

也可以直接使用CacheManager来对中间结果缓存

@Override
public User getUser(Integer id) {
    logjs.info("用户"+id+"开始执行数据库查询");
    User user =  userMapper.getUser(id);   
     //可China编程以直接使用CacheManager来对中间结果缓存
    Cache cache = cacheManager.getCache("user");
    cache.put("test",1111);
    return user;
}

6.附 demo 实例

Spring Boot 整合 Redis 实现数据缓存

百度网盘下载地址:

链接: https://pan.baidu.com/s/16bNmeIynFTHJ88PGf5ux4A

提取码: jm67

到此这篇关于Spring Boot 整合 Redis 实现数据缓存的文章就介绍到这了,更多相关Spring Boot Redis 数据缓存内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Spring Boot 整合 Redis 实现数据缓存案例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154739

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方