当前位置: 代码网 > it编程>数据库>Redis > RedisTemplate默认序列化方式显示中文乱码的解决

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

2025年06月06日 Redis 我要评论
在 spring data redis 中,存储数据时出现乱码通常是因为 redistemplate 的默认序列化方式(jdkserializationredisserializer)将数据存储为二进

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

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

1. 问题原因

  • 默认情况下,spring data redis 使用 jdkserializationredisserializer,它会将对象序列化为二进制格式,导致 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.jackson2jsonredisserializer;
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<>();
        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.setobjectmapper(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默认序列化乱码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com