redis作为缓存时,value乱码问题解决

本文介绍如何通过自定义RedisTemplate和CacheManager中的序列化方式来解决Redis缓存中Value出现乱码的问题,采用JSON格式序列化并提供具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis作为缓存时,value乱码问题解决

需要自定义redistemplate和cachemanager中的value的序列化方式;

package com.zr.aop.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zr.aop.pojo.User;
import org.springframework.cache.CacheManager;
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.core.RedisTemplate;
import org.springframework.data.redis.serializer.*;

import java.time.Duration;

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
    RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
    template.setConnectionFactory(redisConnectionFactory);
    //使用JSON格式的序列化,保存
   template.setKeySerializer(new StringRedisSerializer());
   template.setHashKeySerializer(new StringRedisSerializer());
   template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
   template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}

//自定义cacheManager缓存管理器
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory)
{
    RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    //解决查询缓存转换异常的问题
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    //配置序列化(解决乱码的问题)
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ZERO)
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
            .disableCachingNullValues();

    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .build();
    return cacheManager;
}

}

<think>好的,我现在需要帮助用户解决在Spring Boot项目中集成和使用Redis作为缓存问题。首先,我得回忆一下之前学过的相关知识,然后结合用户提供的引用内容来组织回答。 用户引用的内容里有几个关键点:添加依赖、配置Redis连接信息、创建RedisService类、使用@Cacheable注解以及RedisTemplate的操作。我需要确保这些步骤都被涵盖到,同结构要清晰,符合用户的要求。 首先,应该从添加依赖开始。用户提到引用[2]和[3]中都有提到添加依赖项,特别是spring-boot-starter-data-redis。这部分是基础,必须包括进去,并且给出具体的Maven或Gradle配置示例。 接下来是配置Redis连接信息。根据引用[2]和[4],需要在application.properties或application.yml中设置host、port、password等参数。这里要详细说明每个配置项的作用,以及如何根据实际情况修改。 然后,可能需要提到启用缓存支持,使用@EnableCaching注解,如引用[3]和[5]中所述。这一步很重要,否则缓存注解不会生效。 接下来是创建服务类并使用@Cacheable注解。引用[5]中的例子展示了如何在方法上使用该注解,指定缓存名称和键。需要解释这些参数的作用,并说明缓存的工作原理,比如当方法被调用,如何检查缓存是否存在,不存在则执行方法并将结果存入缓存。 此外,引用[4]提到了使用RedisTemplate,可能需要补充这部分内容。例如,配置RedisTemplate的序列化方式,避免存储乱码,以及如何通过RedisTemplate直接操作Redis,比如set、get等方法。不过用户的主要需求是缓存配置,这部分可以作为进阶内容简要提及。 还要注意引用[1]中提到的Spring Boot支持的缓存组件,这里需要确认Redis是其中之一,并且说明整合Redis的优势,比如高性能、持久化等。 用户的问题可能还包括如何验证配置是否成功,所以可以建议编写一个测试Controller,调用带有@Cacheable注解的方法,观察日志或使用Redis客户端工具检查数据是否被缓存。 需要确保回答符合用户的要求:结构清晰,分步骤说明,尽量真实可靠,引用正确的引用标记。例如,在提到配置连接信息,末尾添加[^2],提到@Cacheable引用[^3]和[^5]。 最后,生成的相关问题需要围绕集成Redis缓存可能遇到的扩展问题,比如配置过期间、缓存穿透/雪崩的解决方案、集群配置等,这些都能帮助用户进一步学习。 现在需要检查是否有遗漏的步骤,比如是否要提到缓存管理器(RedisCacheManager)的配置?根据引用[4]中的RedisConfig类,可能需要说明通过配置类自定义RedisTemplate的序列化方式,但如果是默认配置,可能不需要,除非用户有特殊需求。这里可能根据引用[4]的内容,简要提到配置RedisTemplate的示例,但用户主要关注的是基础配置,所以可能作为可选的高级配置部分。 总结回答的步骤应该是:添加依赖→配置连接→启用缓存→使用注解→示例演示。此外,RedisTemplate的使用可以作为另一种操作方式补充,但重点在注解方式的缓存使用。</think>### Spring Boot集成Redis缓存配置教程 #### 1. 添加Redis依赖 在`pom.xml`中引入Spring Boot的Redis Starter依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 此依赖提供了RedisTemplate和缓存注解支持[^3]。 #### 2. 配置Redis连接信息 在`application.properties`中配置Redis服务器信息: ```properties spring.redis.host=localhost spring.redis.port=6379 spring.redis.password=your_password spring.redis.database=0 ``` 若使用连接池,可添加以下配置: ```properties spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-idle=8 ``` #### 3. 启用缓存功能 在主启动类添加`@EnableCaching`注解: ```java @SpringBootApplication @EnableCaching public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 4. 使用@Cacheable注解缓存数据 在Service层方法上添加缓存注解: ```java @Service public class UserService { @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { // 模拟数据库查询 return userRepository.findById(id).orElse(null); } } ``` - `value`指定缓存名称 - `key`使用SpEL表达式定义缓存键 #### 5. 自定义RedisTemplate(可选) 配置序列化方式避免乱码: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(factory); return template; } } ``` 此配置使键值对以JSON格式存储[^4]。 #### 6. 验证缓存效果 创建测试Controller: ```java @RestController public class TestController { @Autowired private UserService userService; @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return userService.getUserById(id); } } ``` 首次访问会执行数据库查询,后续请求直接从Redis获取数据。 ### 关键配置说明 | 配置项 | 说明 | 示例值 | |----------------------------|-------------------------------|----------------| | spring.redis.host | Redis服务器地址 | 127.0.0.1 | | spring.redis.port | Redis服务端口 | 6379 | | spring.redis.password | 访问密码(无密码可省略) | your_password | | @Cacheable.cacheNames | 定义缓存分区名称 | "userCache" |
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值