Redis序列化、乱码问题

news2024/11/15 17:36:46

Redis序列化问题

每当初学者学习Redis,并且使用SpringBoot整合Redis的时候,总会看到别人使用这种东西—配置类,然后自己又看不懂,oh,fuck!!

这是为什么,为什么要有这个配置类???

package com.example.txf_redis.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;

@Configuration
public class RedisConfig {
    @Bean
    //配置redisTemplate
    // 默认情况下的模板只能支持 RedisTemplate<String,String>,
    // 只能存入字符串,很多时候,我们需要自定义 RedisTemplate ,设置序列化器
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,Object> template = new RedisTemplate <>();
        template.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }
}

下面我来发表一下我自己的看法:

1.不用配置类

在这里插入图片描述

下面是实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {
    private static final long serialVersionUID = -1;
    private Integer id;
    private String name;
    private String desc;
}

@Data
public class People implements Serializable {
    private static final long serialVersionUID = -1;
    private Student student;

    public People() {
    }

    public People(Student student) {
        this.student = student;
    }

    private Integer getId() {
        return student.getId();
    }

    private String getName() {
        return student.getName();
    }

    private String getDesc() {
        return student.getDesc();
    }


}

People对象里面有一个成员叫Student

运行测试,第一个方法,然后去Redis里面查看key

在这里插入图片描述

就算我们不用JSON工具,直接插入,同样有问题

@Test
    void contextLoads() {
        Student student = new Student(1, "田小锋", "爱吃饭");
        People people = new People(student);
//        redisTemplate.opsForValue().set("user"+student.getId(), JSON.toJSONString(people));
        redisTemplate.opsForValue().set("user"+student.getId(),people);
    }

为什么Key是那样的呢?不应该只是user1吗?

这就回到了主题了,序列化问题。

因redis默认使用JdkSerializationRedisSerializer来进行序列化,造成key是乱码

原因分析:
spring-data-redis 的 RedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。spring操作redis是在jedis客户端基础上
进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,
看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型对象,
而不是byte[]类型的,
这样导致的一个问题就是,如果不对RedisTemplate进行设置,
spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();
这个方法来对key、value进行序列化操作,
JdkSerializationRedisSerializer它使用的编码是ISO-8859-1
    
来自:https://blog.csdn.net/m4330187/article/details/108091447

总的来看就是编码有问题

2.使用配置类

所以我们需要用一下这个配置类,在开头已经给出了,(不一定要这个一模一样的啊)我们把配置类,重新使用上,再试试

在这里插入图片描述

然后发现,存取都没有问题了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch优化器全总结(四)常用优化器性能对比 含代码

目录 写在前面 一、优化器介绍 1.SGDMomentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二、优化器对比 优化器系列文章列表 Pytorch优化器全总结&#xff08;一&#xff09;SGD、ASGD、Rprop、Adagrad Pytorch优化器全总结&#xff08;二…

设计模式学习(七):Factory Method工厂模式

目录 一、什么是Factory Method模式 二、Factory Method示例代码 2.1 类之间的关系 2.2 Product类 2.3 Factory类 2.4 IDCard类 2.5 IDCardFactory类 2.6 用于测试的Main类 2.7 运行结果 三、拓展思路的要点 3.1 框架与具体加工 3.2 使用模式与开发人员之间的沟通 …

(12)go-micro微服务JWT跨域认证

文章目录一 JWT介绍二 JWT优缺点三 JWT使用1. 导包和数据定义2.生成JWT3.解析JWT4.完整代码四 最后一 JWT介绍 JWT 英文名是 Json Web Token &#xff0c;是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范&#xff0c;经常用在跨域身份验证。 JWT 以 JS…

拐点检测常用算法总结

目录概览问题定义符号定义研究方法损失函数概览 问题定义 拐点检测名为 change point detection&#xff0c;对于一条不平缓的时间序列曲线&#xff0c;认为存在一些时间点 (t1,t2,...,tk)( t_1 , t_2 , . . . , t_k )(t1​,t2​,...,tk​) &#xff0c;使得曲线在这些点对应…

Java SPI的介绍、JDBC中SPI的应用、自己实现一个SPI应用

目录1. Java SPI介绍2. Java SPI的运行流程3. Java SPI在JDBC中的应用4. Java SPI的三大规范要素5. 自己实现一个SPI应用5.1 Service接口5.2 运营商1的Service Provider5.3 运营商2的Service Provider5.3 手机使用网络1. Java SPI介绍 SPI(Service Provider Interface)是一种基…

在别墅大宅中打造全屋智能,总共需要几步?

关于智能家居&#xff0c;很多读者可能会想起一些不那么愉快的回忆&#xff1a;2014年左右的智能家居浪潮&#xff0c;涌现出了众多带蓝牙互联功能的家电产品&#xff0c;但数据无法互联互通、单品体验升级有限&#xff0c;加上一些企业竞争失败产品不再更新&#xff0c;留给消…

EXCEL工具介绍

目录1. 锁定功能2. 固定1. 锁定功能 锁定&#xff1a;F4 公式引用单元格&#xff0c;有“相对引用”与“绝对引用” 美元符号“ $ ”在excel公式中的作用是在“绝对引用”时&#xff0c;锁定行号或列标&#xff08;单元格地址由列标行号组成&#xff0c;如A1&#xff0c;A为列…

国产软件不惧微软,WPS力扛大旗,新型办公软件争相助力

金山作为程序员的“黄埔军校”&#xff0c;输入了一批批互联网大佬&#xff0c;小米的雷军、哔哩哔哩的陈睿、蓝港互动的王峰等都师出金山。WPS作为金山拳头作品&#xff0c;有着“国民软件”美誉&#xff0c;功能强大&#xff0c;使用体验一点不输微软word&#xff0c;然而有一…

打工人必学的法律知识(三)——《中华人民共和国劳动争议调解仲裁法》

PS &#xff1a; 对与日常工作比较紧密的部分做摘录 中华人民共和国劳动争议调解仲裁法http://www.npc.gov.cn/npc/c198/200712/756d4eceb95e420a87c97545a58d931c.shtml 目录 一、调解 二、仲裁 三、申请和受理 四、开庭和裁决 五、附则 第六条 发生劳动争议&#xff0…

python镜像设置

winr 输入 %USERPROFILE% 新建pip目录&#xff0c;目录内新建pip.ini 输入&#xff1a; [global] index-urlhttp://mirrors.aliyun.com/pypi/simple/ trusted-hostmirrors.aliyun.com

计算机网络概括

1 前言计算机网络是指将位于不同地理位置&#xff0c;但具有独立功能的多台设备&#xff0c;通过通信设备和线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件、网络通信协议的协调管理下&#xff0c;实现资源共享和信息传递的计算机系统。简单来说&#xff0c;…

STM32模拟SPI总线读写RFID模块RC522

STM32模拟SPI总线读写RFID模块RC522 RC522是一款NXP 公司的支持ISO14443A协议的高频&#xff08;13.56MHz&#xff09;RFID射频芯片。RFID有ID和IC两种卡应用类型&#xff0c;RC522属于IC卡的应用类型。NFC则属于增强的IC卡类型&#xff0c;支持双向通信和更多类型的协议。 I…

es官网翻译之Exploring Your Cluster

Exploring Your Cluster 探索你的集群 The rest api rest 风格的 api Now that we have our node (and cluster) up and running, the next step is to understand how to 现在 我们已经将我们自己的节点(和集群) 启动并运行着, 下一个步骤是知道如何 communicate with it…

Java面试题每日10问(12)

1. What is String Pool? String pool is the space reserved in the heap memory that can be used to store the strings.The main advantage of using the String pool is whenever we create a string literal; the JVM checks the “string constant pool” first.If th…

速度为单GPU1.6倍,kaggle双GPU(ddp模式)加速pytorch攻略

accelerate 是huggingface开源的一个方便将pytorch模型迁移到 GPU/multi-GPUs/TPU/fp16 模式下训练的小巧工具。和标准的 pytorch 方法相比&#xff0c;使用accelerate 进行多GPU DDP模式/TPU/fp16 训练你的模型变得非常简单(只需要在标准的pytorch训练代码中改动不几行代码就可…

linux基功系列之man帮助命令实战

文章目录前言一、man命令介绍二、常用参数2.1 语法2.2 常用参数2.3 man页面的操作命令man命令使用案例1. 直接查看手册2. -aw 参数找到可以被查询的章节2.3 一次性查阅所有章节2.4 搜索手册页2.5 -L 设置查询语言总结前言 linux系统中的命令数量有上千的&#xff0c;即使是常用…

前端——周总结系列二

1 JS数组排序sort()方法 不传参数排序&#xff0c;默认根据Unicode排序 附录 传参数&#xff0c;使用比较函数&#xff0c;自己定义比较规则 简单数组排序 // 升序 function ascSort(a, b) {return a - b; } // 降序 function ascSort(a, b) {return b - a; }数组对象排序…

算法leetcode|31. 下一个排列(rust重拳出击)

文章目录31. 下一个排列&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgoccpythonjava31. 下一个排列&#xff1a; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0…

ROS2机器人编程简述humble-第二章-First Steps with ROS2 .1

ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2学习笔记流水账-推荐阅读原书。第二章主要就是一些ROS的基本概念&#xff0c;其实ROS1和ROS2的基本概念很多都是类似的。ROS2机器人个人教程博客汇总&#xff08;2021共6套&#xff09;如何更…

Linux chgrp 命令

Linux chgrp&#xff08;英文全拼&#xff1a;change group&#xff09;命令用于变更文件或目录的所属群组。与 chown 命令不同&#xff0c;chgrp 允许普通用户改变文件所属的组&#xff0c;只要该用户是该组的一员。在 UNIX 系统家族里&#xff0c;文件或目录权限的掌控以拥有…