RedisTemplate默认序列化方式显示中文乱码的解决

2025-06-06 15:50

本文主要是介绍RedisTemplate默认序列化方式显示中文乱码的解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示...

在 Spring Data Redis 中,存储数据时出现乱码通常是因为 RedisTemplate 的默认序列化方式(JdkSerializationRedisSerializer)将数据存储为二进制格式,而不是可读的字符串格式。要解决这个问题,你可以通过配置 RedisTemplate,使用合适的序列化器(如 StringRedisSerializer 或 Jackson2jsonRedisSerializer)来存储数据。

以下是解决方案和配置示例:

1. 问题原因

  • 默认情况下,Spring Data Redis 使用 JdkSerializationRedisSerialiwww.chinasem.cnzer,它会将对象序列化为二进制格式,导致 Redis 中存储的数据不可读。
  • 如果你希望存储为可读的字符串或 JSON 格式,需要修改 RedisTemplate 的序列化器。

2. 解决方案

通过配置 RedisTemplate,指定 key 和 value 的序列化器。常用的序列化器包括:

  • StringRedisSerializer:将 key 和 value 存储为字符串。
  • Jackson2JsonRedisSerializer:将 value 存储为 JSON 格式。

3. 配置类示例

以下是一个配置类的示例,使用 StringRedisSerializer 和 Jackson2JsonRedisSerializer

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsChina编程onRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterXML.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<http://www.chinasem.cn>();
        template.setConnectionFactory(redisConnectionFactory);

        // 使用 StringRedisSerializer 序列化 key
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        // 使用 Jackson2JsonRedisSerializer 序列化 value
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.activateDefaultTyping(
            LaissezFaireSubTypeValidator.instance,
            ObjectMapper.DefaultTyping.NON_FINAL,
            JsonTypeInfo.As.PROPERTY
        );
        serializer.setObjecjavascripttMapper(objectMapper);

        template.setValueSerializer(serializer);
  编程      template.setHashValueSerializer(serializer);

        return template;
    }
}

4. 配置说明

  • StringRedisSerializer
    • 用于序列化 key 和 hash key,确保 key 是字符串格式。
  • Jackson2JsonRedisSerializer
    • 用于序列化 value 和 hash value,将对象存储为 JSON 格式。
    • 通过 ObjectMapper 配置支持多态类型(activateDefaultTyping),以便反序列化时能正确还原对象类型。

5. 使用示例

配置完成后,RedisTemplate 会自动使用新的序列化器。以下是一个简单的使用示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void saveUser(String key, User user) {
        redisTemplate.opsForValue().set(key, user);
    }

    public User getUser(String key) {
        return (User) redisTemplate.opsForValue().get(key);
    }
}

6. 验证存储结果

  • 使用 StringRedisSerializer 和 Jackson2JsonRedisSerializer 后,Redis 中存储的数据将是可读的字符串或 JSON 格式。
  • 例如,存储的 key 会是 user:1,value 会是 {"id":1,"name":"John"}

7. 注意事项

  • 如果已经存储了二进制格式的数据,修改序列化器后,需要手动清理 Redis 中的数据,或者编写迁移脚本将旧数据转换为新格式。
  • 如果存储的是复杂对象(如集合或嵌套对象),确保 ObjectMapper 配置正确,以支持反序列化。

总结

通过配置 RedisTemplate 的序列化器,可以解决 Spring Data Redis 存储数据乱码的问题。推荐使用 StringRedisSerializer 和 Jackson2JsonRedisSerializer,分别处理 key 和 value 的序列化。

到此这篇关于RedisTemplate默认序列化方式显示中文乱码的解决的文章就介绍到这了,更多相关RedisTemplate默认序列化乱码内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于RedisTemplate默认序列化方式显示中文乱码的解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一