Redis客户端 - RedisSerializer

article/2025/9/20 10:03:28

原文首更地址,阅读效果更佳!

Redis客户端 - RedisSerializer | CoderMast编程桅杆icon-default.png?t=N5F7https://www.codermast.com/database/redis/redistemplate-redis-serializer.html

前景回顾

在上一篇中,我们实现了一个简单的案例,操作一个 String 类型的数据,插入了一个 name = codermast 的数据到Redis。

使用redis-cli客户端连接对应的Redis服务器后,按道理来讲get name这个指令的返回结果应该是 codermast

redis-cli客户端查看

返回的结果是无,这是为什么呢?使用可视化工具查看一下,看看到底数据是否存储在Redis服务器中。

使用可视化工具查看

可以明显的看到,所存储的 key 之前加上了一段字符,但是从代码中看,存储的 key 为 "name",但是实际存储的 key 是 \xac\xed\x00\x05t\x00\x04name,而且里面的 value 也做了同样的处理 \xac\xed\x00\x05t\x00\x09codermast

出现这种现象的原因是什么呢?这是因为 RedisTemplate 在底层将数据序列化处理以后,才存储到 Redis 服务器中。

RedisTemplate 可以接收任意 Object 作为值写入 Redis ,只不过在写入之前会把 Object 序列化成为字节形式,默认是采用 JDK 序列化,得到的结果就如图所示。

缺点

  • 可读性差
  • 资源占用高

既然这样可读性又差,资源占用又高,那么如何解决这些问题呢?我们可以通过自定义 RedisTemplate 序列化的方式来解决。

#编写一个 RedisConfig 配置类

@Configuration
public class RedisTemplate{@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){// 1.创建RedisTemplate对象RedisTemplate<String ,Object> redisTemplate = new RedisTemplate<>();// 2.设置连接⼯⼚redisTemplate.setConnectionFactory(factory);// 3.创建序列化对象StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 4.设置 key 和 hashKey 采⽤ String 的序列化⽅式redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);// 5.设置 value 和 hashValue 采⽤ json的 序列化⽅式redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);return redisTemplate;}
}

注意

我们自定义的配置类中,使用到了 Jackson 序列化类,所以在使用之前需要导入 jackson-datebind 这个依赖项。

<!-- jackson-databind 依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

#自定义序列化方式

自定义的序列化方式也加进去了对引用类型的序列化,我们来实际测试一下。

  • 编写一个 User 类

@Data
public User{Integer age;String name;
}

类中属性需要给出 set 和 get方法

  • 将 User 对象存储至 Redis

@Test
void testObject(){User user = new User();user.setAge(18);user.setName("codermast");// 插入一条 Object 类型的数据redisTemplate.opsForValue().set("user",user);// 获取一条 Object 类型的数据User user_coder = (User)redisTemplate.opsForValue().get("user");System.out.println(user_coder);
}

 

虽然 JSON 的序列化方式可以满足我们存储对象的需求,为了在反序列化时知道对象的类型,将对象的类路径地址也序列化进 JSON 结果中,存入 Redis ,会带来额外的资源消耗。

针对如图所示的特殊情况,类路径地址比我们真实的数据内容还大,造成了极大的资源浪费。

#优化自定义序列化

为了节省内存空间,通常情况下不会使用 JSON 序列化器来处理 Value ,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当要存储 Java 对象时,手动完成对象的序列化和反序列化。

 

Spring 默认提供了一个 StringRedisTemplate 类,它的 key 和 value 的序列化方式默认就是 String 方式,省去了我们自定义的 RedisTemplate 的过程。

现在在存储数据之前需要进行手动序列化,在获取数据以后,需要手动反序列化对象。

#小结

RedisTemplate 的两种序列化实践方案

  1. 方案一
    • 自定义RedisTemplate
    • 修改RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer
  2. 方案二
    • 使用 StringRedisTemplate
    • 写入 Redis 之前,将对象手动序列化为 JSON
    • 读取数据以后,将 JSON 手动反序列化为对象

提示

上述仅说明了操作 String 类型的数据,操作 Hash、List、Set、SortedSet类型时,使用对应的 ops 对象即可操作。


http://chatgpt.dhexx.cn/article/fGRYBGMd.shtml

相关文章

Redis(11)----Redis客户端

1&#xff0c;前言 Redis服务器是典型的一对多服务器&#xff1a;一个服务器可以与多个客户端建立网络连接&#xff0c;每个客户端可以向服务器发送命令请求&#xff0c;而服务器则接收并处理客户端发送的命令请求&#xff0c;并向客户端返回命令回复 通过使用由I/O多路复用技…

redis-客户端

redis-客户端 1、客户端属性 redis> CLIENT listaddr127.0.0.1:53428 fd6 name age1242 idle0 ... addr127.0.0.1:53469 fd7 name age4 idle4 ...typedef struct redisClient {// ...int fd;robj *name;int flags;sds querybuf;robj **argv;int argc;struct redisCommand …

Mac上好用的redis客户端推荐

推荐mac一个开源免费、好用的redis客户端&#xff1a;QuickRedis 它支持直连、哨兵、集群模式&#xff0c;并且UI是可以的&#xff0c;并且支持树形展示,同时支持json格式展示&#xff0c; 最基本的命令行模式也支持&#xff0c;总体来说界面简洁、功能完善&#xff0c;值得推…

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 Redis管理客户端&#xff0c;兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…

用Redis客户端工具连接Redis

进入redis安装目录 vi redis.conf1.关闭默认的只允许本地登录 2.关掉保护模式 3.requirepass注释去掉&#xff0c;修改密码 4. 开启redis后台运行 5.安装redis客户端连接工具 6.确保 Linux 防火墙已经关闭&#xff0c;再连接redis systemctl stop firewalld.service syste…

【Redis入门篇】| Redis的Java客户端

目录 一&#xff1a; Redis的Java客户端 1. Jedis快速入门 2. Jedis连接池 3. SpringDataRedis快速入门 4. RedisSerializer配置 5. StringRedisTemplate 图书推荐 一&#xff1a; Redis的Java客户端 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;…

redis客户端

1、redis-cli redis自己给我们提供的一个命令行客户端 2、Java客户端-Jedis 是一个Redis的java客户端&#xff08;Java for Redis&#xff09;&#xff0c;老牌的、稳定、封装少的客户端 导包 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><d…

Redis可视化客户端

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 redis的可视化客户端目前较流行的有三个&#xff1a;Redis Client ; Redis Desktop Manager ; Redis Studio. Redis Desktop Ma…

【Redis学习笔记(九)】之 Redis客户端详解

文章目录 本文章由公号【开发小鸽】发布&#xff01;欢迎关注&#xff01;&#xff01;&#xff01;一&#xff0e; 客户端&#xff08;一&#xff09; 概述&#xff08;二&#xff09; 客户端属性1. 套接字描述符2. 名字3. 标志4. 输入缓冲区5. 命令与命令参数6. 命令的实现函…

[Redis]Redis客户端

文章目录 1. Redis 客户端2. Redis 命令行客户端2.1 redis-cli 的使用2.1.1 进入 redis-cli 交互控制台方式一2.1.1 进入 redis-cli 交互控制台方式二 3. Redis 图形化桌面客户端3.1 Redis 图形化桌面客户端下载3.2 Redis 图形化桌面客户端安装3.3 Redis 图形化桌面客户端连接 …

Redis 基础 -- Redis可视化客户端(Redis Desktop Manager)

文章目录 1. Redis可视化客户端&#xff08;Redis Desktop Manager&#xff09;1.1 下载Redis Desktop Manager1.2 安装 Redis Desktop Manager1.3 连接Redis服务器1.4 Redis Desktop Manager 基础操作教学1.4.1 删除数据1.4.2 添加数据1.4.3 查看数据&#xff08;点击即可&…

几款连接redis的客户端(GUI客户端),下面记录了我使用的几款

几款连接redis的客户端(GUI客户端)&#xff0c;下面记录了我使用的几款 一、Redis 客户端 1、命令行工具 命令行 (建议使用&#xff0c;简单) 比如windows的cmd和Linux、Mac的Terminal&#xff0c;虽然最简单好用。 必须保证有 redis-cli 命令(windows 是 redis-cli.exe)&…

windows下Nginx启动失败(常见的两个错误以及解决方案)

问题 windows 10 下启动nginx&#xff0c;闪屏而过&#xff0c;访问localhost显示无法访问。 尝试解决 cmd下使用命令&#xff1a;netstat -an | find "0.0.0.0:80"&#xff0c;可以发现80端口已经被占用。 使用命令&#xff1a;netstat -ano 可以发现占用80端口的…

nginx 启动前端包

项目是前后端分离&#xff1a;前端用vue开发&#xff0c;后端用的是springboot开发&#xff0c;用nginx启动代理&#xff0c;启动前端包 1、安装nginx&#xff08;此步骤就不细说了&#xff0c;如图&#xff09; 2、将前端包放入nginx文件夹下 注&#xff1a;我放在project文…

Nginx 安装教程 (windows) 及详解 并通过Nginx启动项目(vue项目举例)

Nginx 常用命令 Nginx windows安装教程 通过Nginx启动项目(vue项目举例) 目录介绍 Nginx Nginx 是俄罗斯人 Igor Sysoev 编写的轻量级Web服务器&#xff0c;它的发音为 [ˈendʒɪnks] &#xff0c;它不仅是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/P…

nginx修改监听端口号8080_解决Nginx启动失败

一、Nginx下载 http://nginx.org/en/download.html 二、Nginx启动失败原因 1、本人下载的是nginx-1.12.1(稳定版)&#xff0c;下载完解压后&#xff0c;进入路径中&#xff0c;start nginx&#xff0c;发现窗口闪过。但是查找不到nginx进程。 2、进入 nginx-1.12.1\logs 路径下…

linux下nginx启动不了,Nginx启动失败的几种错误处理

nginx启动失败 启动nginx失败&#xff0c;报错信息如下: Starting nginx: nginx: [emerg] bind() to 0.0.0.0:**** failed (13: Permission denied) 这通常是因为开启了SELinux的原因&#xff0c;使用命令 getenforce 可以查看SELinux状态&#xff0c;如果输出为 enforcing …

NGINX启动报错,端口被占用

NGINX启动报错&#xff0c;端口被占用解决方案&#xff08;修改端口号&#xff09;   Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点&#xff08;俄文&#x…

nginx 启动、停止、关闭

1&#xff0c;nginx 指定配置文件 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -c 参数 指定了要加载的nginx配置文件路径 1,从容停止Nginx&#xff1a; kill -QUIT 主进程号 2,快速停止Nginx&#xff1a; kill -TERM 主进程号 3,强制停止Nginx&am…

nginx启动web项目

1、服务器任何路径新建存放项目文件夹 例如:/home/www/xtzl_platform_web 将web项目的压缩包存放到xtzl_platform_web目录下并解压 3、修改nginx配置文件nginx.conf cd /usr/local/nginx/conf ,修改nginx.conf文件 添加新路径 (1)alias方式 location后面的文件名…