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

下面是“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日

相关文章

  • SQL 计算累计差

    SQL 计算累计差可以使用窗口函数进行计算,可以使用SUM函数或LAG函数来实现。下面介绍两条实例。 实例一 我们有以下一张销售表,记录了每个商品的销售量和日期。我们需要对每个商品进行月度累计差值计算。 id product sales date 1 A 50 2021-01-01 2 A 80 2021-02-01 3 A 60 2021-03-01 4 …

    database 2023年3月27日
    00
  • linux skill命令参数及用法详解(linux中断进程执行命令)

    Linux Skill命令参数及用法详解 简介 Skill命令的全称是Signal Kill的简称,意为发送进程信号以终止进程的执行。在Linux操作系统中,进程可能由于某些原因导致无法正常退出,此时就需要使用Skill命令强制终止进程。 命令语法 skill [options] [ -u user ] [ -o ] [ -v ] [ -n ] [ -c c…

    database 2023年5月22日
    00
  • MySql日期查询数据的实现

    想要在MySQL数据库中查询指定日期范围内的数据,可以使用MySQL内置的日期函数,如下: DATE函数 DATE() 函数将日期或日期时间表达式转换为日期格式。该函数的语法如下: SELECT DATE(date expression) FROM table_name; 示例: 查询发布时间为2021年11月1日的文章 SELECT * FROM arti…

    database 2023年5月22日
    00
  • redis+crontab+php异步处理任务

    2016年1月8日 16:08:43 星期五 情景: 用户登录日志, 发邮件, 发短信等等实时性要求不怎么高的业务通常会异步执行 之前接触过几种redis+crontab配套的实现方法, 比如: crontab定时执行curl脚本   1. 用curl 访问URL执行PHP脚本去pop队列   2. PHP程序pop一次, 处理后返回同样的URL   3. …

    Redis 2023年4月11日
    00
  • CentOS7.5安装配置Harbor1.7的全过程

    CentOS7.5安装配置Harbor1.7的全过程 简介 Harbor是企业级的Docker镜像仓库,提供安全、可靠的镜像管理功能,支持LDAP、AD认证、权限管理、日志审计等企业级功能。本文将详细介绍在CentOS7.5上安装配置Harbor1.7的全过程。 准备 安装了CentOS7.5操作系统的服务器,具备root权限。 安装Docker Harbo…

    database 2023年5月22日
    00
  • mysql数据库基本语法及操作大全

    MySQL数据库基本语法及操作大全 MySQL是一种关系型数据库管理系统,被广泛用于Web应用程序开发,它可以在各种操作系统上运行,包括Windows、Linux和macOS等。 在本篇攻略中,我们将会详细讲解MySQL数据库的基本语法及操作,希望能够帮助您更好地了解和运用MySQL数据库。 MySQL基本语法 创建数据库 在MySQL中,可以使用CREAT…

    database 2023年5月21日
    00
  • 手把手教你用SQL获取年、月、周几、日、时

    手把手教你用SQL获取年、月、周几、日、时的完整攻略如下: 1. 获取年月日 获取当前时间的年月日非常简单,使用 SQL 的内置函数 YEAR()、MONTH()、DAY() 即可。例如: SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW()); NOW() 函数可以返回当前时间; YEAR()、MONTH()、DAY() …

    database 2023年5月22日
    00
  • go xorm框架的使用

    Go Xorm是一款Go语言的ORM框架,它提供了对数据库的增删改查操作,支持多种数据库,包括MySQL、PostgreSQL、SQLite、Oracle等等。使用Go Xorm可以极大地简化数据库的操作,提高开发效率。 下面是Go Xorm框架的使用攻略: 安装Go Xorm并创建数据库连接 要安装Go Xorm,可以在终端中执行以下命令: go get …

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