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

相关文章

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

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

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py