springboot集成redis存对象乱码的问题及解决

yizhihongxing

下面是“Spring Boot集成Redis存对象乱码问题及解决”的攻略,内容包括:

问题描述

在使用Spring Boot集成Redis存储对象时,可能会遇到对象乱码的问题,具体表现为从Redis中读取出的对象中文字符变成乱码。这是由于Redis默认使用的是二进制序列化格式来存储对象,而该格式对中文字符的编码是不支持的。

解决方案

解决该问题的方案是更改Redis的序列化方式,将其改为支持中文字符编码的序列化格式。常用的支持中文字符编码的序列化格式包括JSON和Jackson。

使用JSON序列化方式

添加依赖项

首先需要在项目中添加如下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

其中,com.fasterxml.jackson.corejackson-databind依赖项提供了JSON序列化和反序列化的功能。

配置RedisTemplate

接下来需要在项目中配置一个RedisTemplate,用于将Java对象序列化为JSON格式,并将JSON格式的数据存入Redis中。配置RedisTemplate的代码如下:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 设置序列化器
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(objectMapper);

        // 设置编码方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(stringRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

在该配置文件中,首先创建了一个RedisTemplate,然后设置了序列化器。这里使用Jackson2JsonRedisSerializer序列化器将Java对象序列化为JSON格式,以便在Redis中存储。同时,也将StringRedisSerializer编码方式配置为UTF-8格式。最后将RedisTemplate注册为Bean,以便在其他类中使用。

存储对象

完成RedisTemplate的配置之后,就可以将Java对象序列化成JSON格式并存储到Redis中了。下面是一个存储Java对象的示例代码:

@RedisHash("user")
public class User {
    @Id
    private String id;

    private String name;
    private int age;

    // 省略getter和setter方法
}

public class UserService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void save(User user) {
        redisTemplate.opsForHash().put("user", user.getId(), user);
    }

    public User get(String id) {
        return (User) redisTemplate.opsForHash().get("user", id);
    }
}

在上述代码中,使用@RedisHash注解将User类标记为一个Redis类型,与上一节的代码中配置的RedisTemplate搭配使用,序列化器将User对象序列化成JSON格式并使用RedisTemplate将其存储到Redis中。获取对象时,使用RedisTemplate直接从Redis中读取对象并反序列化,然后返回Java对象。

使用Jackson序列化方式

添加依赖项

首先需要在项目中添加如下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

其中,com.fasterxml.jackson.corejackson-databind依赖项提供了JSON序列化和反序列化的功能。

配置RedisTemplate

接下来需要在项目中配置一个RedisTemplate,用于将Java对象序列化为JSON格式,并将JSON格式的数据存入Redis中。配置RedisTemplate的代码如下:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 设置序列化器
        redisTemplate.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

在该配置文件中,创建了一个RedisTemplate,并同时设置了默认的序列化器和编码器。同时,也将StringRedisSerializer编码方式配置为UTF-8格式。最后将RedisTemplate注册为Bean,以便在其他类中使用。

存储对象

完成RedisTemplate的配置之后,就可以将Java对象序列化成JSON格式并存储到Redis中了。下面是一个存储Java对象的示例代码:

public class UserService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void save(User user) {
        redisTemplate.opsForValue().set(user.getId(), user);
    }

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

在上面的代码中,使用RedisTemplate将Java对象序列化成JSON格式并存储到Redis中。获取对象时,使用RedisTemplate直接从Redis中读取对象并反序列化,然后返回Java对象。

总结

通过更改Redis的序列化方式,可以避免从Redis中读取对象时出现乱码的问题。本文介绍了使用支持中文字符编码的JSON序列化和Jackson序列化两种方式,可以根据实际需求选择不同的方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot集成redis存对象乱码的问题及解决 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Asp.Net Oracle数据的通用操作类

    我来详细讲解”Asp.Net Oracle数据的通用操作类”的完整攻略。 什么是”Asp.Net Oracle数据的通用操作类” “Asp.Net Oracle数据的通用操作类”是一个可以在Asp.Net网站中操作Oracle数据库的通用类。它可以帮助开发者快速地连接Oracle数据库、执行SQL语句、调用存储过程等操作,提高代码的复用性和开发效率。 如何使…

    database 2023年5月21日
    00
  • Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储

    此文根据【QCON高可用架构群】分享内容,由群内【编辑组】志愿整理,转发请注明出处。 苏东旭,Ping CAP CTO,Codis作者 开源项目Codis的co-author黄东旭,之前在豌豆荚从事infrastructure相关的工作。现在在创业公司PingCAP。 本次分享的内容主要包括五个大部分: Redis、RedisCluster和Codis; 我…

    Redis 2023年4月11日
    00
  • Redis的各个数据的类型基本命令

    什么是Redis: 概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。 特征:1. 数据间没有必然的关联关系2. 内部采用单线程机制进行工作3. 高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/…

    Redis 2023年4月13日
    00
  • RabbitMQ与Redis队列对比

    本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道…

    Redis 2023年4月11日
    00
  • ubuntu 安装openssh服务器的教程详解

    下面为您详细讲解“ubuntu 安装openssh服务器的教程详解”。 一、安装openssh服务器 在ubuntu系统中,首先需要安装openssh服务器软件,具体操作如下: 打开终端,输入以下命令: sudo apt-get update sudo apt-get install openssh-server 第一条命令表示更新软件包列表; 第二条命令表…

    database 2023年5月22日
    00
  • MySQL 5.7.22 二进制包安装及免安装版Windows配置方法

    下面是我为你准备的“MySQL 5.7.22 二进制包安装及免安装版Windows配置方法”的完整攻略: 1. 下载MySQL 5.7.22 二进制包和免安装版MySQL 首先,你需要到MySQL官网下载MySQL 5.7.22二进制包和免安装版MySQL(压缩包格式)。接着将它们解压到本地目录。 2. 配置环境变量 接下来,在配置MySQL环境时,需要将M…

    database 2023年5月22日
    00
  • Mysql数据类型与CRUD操作详细讲解

    Mysql数据类型与CRUD操作详细讲解 MySQL是一种流行的关系型数据库管理系统,常用于访问、存储和管理数据。在使用MySQL时,了解其支持的数据类型和常见的CRUD操作是非常重要的。 Mysql数据类型 MySQL支持多种数据类型,包括数值型、字符型、日期时间型等等。以下是一些常见的数据类型及其用途: INT – 整型数据,用于存储整数。 VARCHA…

    database 2023年5月18日
    00
  • 一款高颜值且免费的 SQL 开发工具之Beekeeper Studio详解

    一款高颜值且免费的 SQL 开发工具之 Beekeeper Studio 详解 Beekeeper Studio 简介 Beekeeper Studio 是一款兼容所有主流数据库的 SQL 开发工具,它采用现代化的界面设计,支持多种操作系统,包括 Windows、MacOS 和 Linux 等。Beekeeper Studio 能够方便地连接到 MySQL、…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部