使用RedisTemplate存储到redis的值乱码了怎么解决?

文章讲述了在使用SpringBoot的RedisTemplate时遇到的乱码问题,原因是默认使用JDK序列化导致。解决方案是自定义Redis配置类,将key和value的序列化方式改为String和Json,引入Jackson依赖并配置RedisTemplate使用GenericJackson2JsonRedisSerializer进行序列化。

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

(1)如下图,key和value都乱码了
在这里插入图片描述

(2)为什么会产生乱码?RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,直接使用下图的代码就会出现(1)图所示现象。
在这里插入图片描述
(3)解决问题

	@Test
	void testString() {

		redisTemplate.setKeySerializer(RedisSerializer.string());
		redisTemplate.setValueSerializer(RedisSerializer.string());
		redisTemplate.opsForValue().set("age", "18");

		Object age = redisTemplate.opsForValue().get("age");
		System.out.println("age = " + age);
	}

在这里插入图片描述
从根本上解决问题
(1)创建redis配置类

package com.juexing.redisspringboot;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    /**
     * RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的一串很长的值
     * 缺点:可读性查、浪费存储空间
     */
	@Bean
	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//		1.创建 redisTemplate
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//		2.设置连接工厂
		redisTemplate.setConnectionFactory(redisConnectionFactory);
//		3.设置序列化工具
		GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//		key 和 hashkey 采用 String 序列化
		redisTemplate.setKeySerializer(RedisSerializer.string());
		redisTemplate.setHashKeySerializer(RedisSerializer.string());
//		value 和 hashvalue 采用 json 序列化
		redisTemplate.setValueSerializer(jsonRedisSerializer);
		redisTemplate.setHashValueSerializer(jsonRedisSerializer);
		return  redisTemplate;
	};
}

(2)修改RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

重新启动,若报了如下错误,说是缺少jackson依赖,引入依赖即可

<!--	jackson依赖	-->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.13.5</version>
		</dependency>

我的项目结构
在这里插入图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.10</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.juexing</groupId>
	<artifactId>redis-springboot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>redis-springboot</name>
	<description>redis-springboot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
<!--	redis依赖	-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
<!--	redis连接池依赖	-->
<!--		<dependency>-->
<!--			<groupId>org.apache.commons</groupId>-->
<!--			<artifactId>commons-collections4</artifactId>-->
<!--			<version>4.4</version>-->
<!--		</dependency>-->
<!--	lombok	-->

<!--	jackson依赖	-->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.13.5</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
<!--	单元测试	-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

至此,问题解决,如有疑问可评论区留言!

<think>好的,用户遇到了Docker中Redis出现乱码的问题,需要解决。首先,我得回忆一下常见的乱码原因。通常字符编码问题可能出现在客户端和服务器端的设置不一致,比如Redis默认使用UTF-8,如果客户端没有正确配置,可能会显示乱码。另外,终端或客户端的编码设置也可能导致这个问题。 接下来,我需要考虑Docker环境中的特定因素。用户可能运行Redis容器时没有正确设置环境变量,比如LANG或者LC_ALL,这些可能会影响容器内的字符处理。此外,数据持久化路径的挂载是否有问题,比如挂载的目录权限或文件编码是否正确。 然后,检查用户提供的引用内容。引用1提到进入容器内部,可能涉及到在容器内检查配置。引用2和3涉及启动容器和连接的方式,尤其是网络配置和客户端连接的正确性。用户可能在使用redis-cli连接时指定了错误的主机IP,或者客户端没有使用正确的编码。 可能的解决步骤包括: 1. 确认客户端和Redis服务器的编码设置是否一致,确保都是UTF-8。 2. 检查Docker容器的环境变量,设置正确的语言和编码。 3. 验证redis-cli的连接命令是否正确,特别是主机参数和编码参数。 4. 检查数据持久化文件是否损坏或编码错误。 5. 查看Redis日志,确认是否有相关错误信息。 需要提醒用户检查客户端应用程序的编码设置,比如在连接Redis时是否指定了charset。另外,确保终端仿真器(如PuTTY)的编码设置为UTF-8。如果数据是通过网络传输的,还要考虑传输过程中是否出现编码问题。 最后,综合引用中的命令,可能需要用户在启动容器时添加环境变量,或者在连接时使用正确的参数。例如,在启动Redis容器时设置LANG环境变量,或者在redis-cli连接时使用--raw选项来保持原始编码。</think>以下是解决Docker中Redis出现乱码问题的分步指南: --- ### **步骤1:确认编码一致性** Redis默认使用UTF-8编码,若客户端未匹配会导致乱码: 1. 检查客户端编码设置(如Python的`redis-py`库需指定`charset='utf-8'`) 2. 终端工具(如Xshell/PuTTY)需设置UTF-8编码[^1] --- ### **步骤2:容器启动时设置环境变量** 在运行Redis容器时强制指定编码: ```bash docker run -d --name redis-container \ -e LANG=C.UTF-8 \ -e LC_ALL=C.UTF-8 \ -p 6379:6379 \ redis:latest ``` 通过`-e`参数显式定义字符集环境变量[^3] --- ### **步骤3:使用正确的CLI连接方式** 连接redis-cli时添加`--raw`参数保留原始编码: ```bash docker exec -it redis-container redis-cli --raw ``` 或从外部连接时指定编码: ```bash redis-cli -h <容器IP> --raw ``` 需先通过`docker inspect <容器ID>`获取实际IP[^2] --- ### **步骤4:验证数据持久化文件** 检查挂载卷的文件编码: 1. 确认宿主机`/app/redis/data`目录权限正常 2. 使用`file -i dump.rdb`检查RDB文件编码 3. 避免直接编辑二进制持久化文件 --- ### **附加排查** - 查看Redis日志确认服务端编码状态: ```bash docker logs redis-container | grep charset ``` - 在Redis配置文件中显式添加: ```conf # redis.conf charset utf-8 ``` --- ### **典型场景示例** Python连接时指定编码: ```python import redis r = redis.Redis( host='容器IP', charset='utf-8', decode_responses=True ) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二次觉醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值