首页 > 数据库 >自定义RedisTemplate,解决Redis乱码问题

自定义RedisTemplate,解决Redis乱码问题

时间:2024-05-26 15:46:40浏览次数:34  
标签:自定义 Redis RedisTemplate 乱码 ObjectMapper 序列化 jsonRedisSerializer objectMapper red

问题:

使用默认的RedisTemplate来操作Redis,在其底层使用的是JDK序列化器,会导致数据乱码问题,可读性差,其优点是兼容性高。

解决:

自定义RedisTemplate,使用Jackson序列化器替代JDK序列化器。

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);
        redisTemplate.setValueSerializer(jsonRedisSerializer());
        redisTemplate.setHashKeySerializer(jsonRedisSerializer());
        return redisTemplate;
    }

    public Jackson2JsonRedisSerializer<Object> jsonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jsonRedisSerializer.setObjectMapper(objectMapper);
        return jsonRedisSerializer;
    }
}

代码解释

objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

setVisibility方法:用于配置ObjectMapper的可见性规则,以确定哪些属性和字段应该被序列化和反序列化。
PropertyAccessor.ALL:表示配置序列化和反序列化的可见性规则应用于所有字段(包括getter/setter,字段,creators等)。
JsonAutoDetect.Visibility.ANY:表示任何(包括private、protected和public)可见性级别的字段和方法都应该被序列化和反序列化。
作用:通过这个设置,ObjectMapper将会检测和处理所有的属性和字段,无论它们的访问级别(private、protected、public)。这对处理被声明为private但仍需要序列化/反序列化的字段非常有用。

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

configure方法:用于配置ObjectMapper的一些特定行为。
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES:这是一个DeserializationFeature选项,控制反序列化过程遇到未知属性时的行为。
false:禁用这个选项。
作用:这个配置的目的是在反序列化过程中,如果JSON数据包含在Java类中不存在的属性,ObjectMapper将不会因为这些未知属性抛出异常,而是忽略它们并继续反序列化。这确保了在处理可能包含多余或未知字段的JSON数据时的鲁棒性。

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);

enableDefaultTyping方法:启用默认的类型处理机制,用于在序列化时添加类型信息并在反序列化时正确处理类型信息。
ObjectMapper.DefaultTyping.NON_FINAL:启用类型信息处理,对于所有非final类。final类如String、Integer等将不被处理。
JsonTypeInfo.As.PROPERTY:指定将类型信息作为属性包含在JSON中。
作用:启用这个配置后,ObjectMapper将会在序列化对象时添加额外的类型信息,确保反序列化时能够正确地还原对象的实际类型。将类型信息作为JSON对象的属性存储,可以在反序列化阶段使用这些信息来创建正确的对象类型。

标签:自定义,Redis,RedisTemplate,乱码,ObjectMapper,序列化,jsonRedisSerializer,objectMapper,red
From: https://www.cnblogs.com/shushulelan/p/18213756

相关文章

  • Haskell 的 自定义类型(data、type)
    在Haskell中,type和data关键字都用于定义新的数据类型,但它们有着不同的作用和语法。一、type关键字:作用:type关键字用于为已有类型创建别名,使得代码更易读和更具可读性。语法:其语法为typeNewType=ExistingType,其中NewType是新类型的名称,ExistingType是已有类......
  • Redis 配置
    Redis的配置文件位于Redis安装目录下,文件名为 redis.conf(Windows名为redis.windows.conf)。 查看配置你可以通过 CONFIG 命令查看配置项。 语法CONFIGGET命令格式如下:CONFIGGETCONFIG_SETTING_NAME 实例-获取指定配置项redis127.0.0.1:6379>CON......
  • 改造 Kubernetes 自定义调度器
    原文出处:改造Kubernetes自定义调度器|Jayden'sBlog(jaydenchang.top)OverviewKubernetes默认调度器在调度Pod时并不关心特殊资源例如磁盘、GPU等,因此突发奇想来改造调度器,在翻阅官方调度器框架[1]、调度器配置[2]和参考大佬的文章[3]后,自己也来尝试改写一下。环境......
  • Netty_Redis_Zookeeper高并发实战-读书笔记
    转载自:https://www.cnblogs.com/leihongzhi/p/17381156.html 第1章    高并发时代的必备技能1.nettyNetty是JBOSS提供的一个Java开源框架,基于NIO的客户端/服务器编程框架,能够快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。NIO是......
  • 4.Redis之Redis的通用命令
    0.Redis实战操作通过redis-cli客户端和redis服务器交互涉及到很多的redis的命令【redis的命令非常非常多!!!1.掌握常用命令(多操作多练习)2.学会使用redis的文档->阅读文档,是程序猿的基操!!redis的命令非常非常多!!!1.掌握常用命令(多操作多练习)2.学会......
  • 写入自定义 ASP.NET Core 中间件
    中间件是一种装配到应用管道以处理请求和响应的软件。ASP.NETCore提供了一组丰富的内置中间件组件,但在某些情况下,你可能需要写入自定义中间件。自定义中间件类通常,中间件封装在类中,并且通过扩展方法公开。一、内联中间件(不推荐) 请考虑以下内联中间件,该中间件通过查询字......
  • 【从0到1学习Redis】数据类型 — String
    首先要先启动好服务,使用redis-cli进入到客户端。自增、自减和相加减操作自增1INCR自减1DECR步长i+=INCRBY字符串范围range截取GETRANGE替换SETRANGE是否存在设置过期时间setex(setwithexpire)不存在时再设置(在分布式锁中常常会使用!)setnx(set......
  • 软考高级之redis中使用zset实现延迟队列,你答对了么?
    实现延迟队列的思路zset的特性,带有分数的排序,以时间戳作为分数进行排序添加任务zdd取出任务zrangbyscore执行任务zrem定时任务publicstaticvoidmain(String[]args){Jedisjedis=newJedis("ip",6379);TimerTasktask=newTimerTask()......
  • sqlite 不支持毫秒怎么办,可以用sqlalchemy自定义类型
    fromsqlalchemyimportDECIMAL,Index,String,Date,Integer,Text,CHAR,SmallInteger,Float,Time,case,and_,extract,Boolean,Enum,TypeDecorator#自定义类型classDateTimeString(TypeDecorator):impl=Stringdefprocess_bind_param(self,value......
  • 自定义一个SpringBoot场景启动器
    前言一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章,如有大神发现错误,敬请斧正,不胜感激。分析SpringBoot自动配置原理SpringBoot的启动从被@SpringBootApplication修饰的启动类开始,@SpringBootApplicaiotn注解中最重要的注解是@EnableAutoConfigurat......