封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>

封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>(使用lettuce连接池)

    • 代码环境
      • 框架:springboot
      • 依赖:spring-boot-starter-data-redis
    • 步骤1:注入LettuceConnectionFactory连接池代码思路
      • 参数1:RedisStandaloneConfiguration配置实例代码
      • 参数2:LettuceClientConfiguration配置实例思路
      • 参数2:LettuceClientConfiguration配置关键代码
    • 步骤2:封装自定义的redis切库工具
      • 实现一个自定义的RedisTemplate需要什么?
      • 切库关键代码
    • 步骤3:redis中读取List序列化的byte数组
      • 实例化ByteArrayRedisTemplate

代码环境

框架:springboot

依赖:spring-boot-starter-data-redis

步骤1:注入LettuceConnectionFactory连接池代码思路

首先注入bean的方法中返回LettuceConnectionFactory对象:

//伪代码
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(RedisStandaloneConfiguration类型 standaloneConfig,LettuceClientConfiguration类型 clientConfig);

需要两个参数:
1)RedisStandaloneConfiguration是单机配置。
2)LettuceClientConfiguration是LettuceClient连接池配置。
下文详细讲解。

参数1:RedisStandaloneConfiguration配置实例代码

RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();redisStandaloneConfiguration.setDatabase(database);redisStandaloneConfiguration.setHostName(host);redisStandaloneConfiguration.setPort(port);if (StringUtils.isNotEmpty(password)) {redisStandaloneConfiguration.setPassword(password);}

RedisStandaloneConfiguration可改其他配置:RedisSentinelConfiguration是哨兵配置,RedisClusterConfiguration是集群模式。

参数2:LettuceClientConfiguration配置实例思路

查看LettuceClientConfiguration源码,发现LettuceClientConfiguration是一个接口。没办法直接new一个了。

不急,源码看一下。
有没有配置连接池的方法。LettuceClientConfiguration中发现有个builder():

static LettuceClientConfigurationBuilder builder() {return new LettuceClientConfigurationBuilder();}

点进去查看LettuceClientConfigurationBuilder类,未发现连接池的配置方法。

换个思路:看看LettuceClientConfigurationBuilder的子类。发现子类LettucePoolingClientConfigurationBuilder有一个poolConfig。

瞧,找到配置连接池的地方了。如图:

在这里插入图片描述
poolConfig方法如下,想想怎么实现一下?

public LettucePoolingClientConfigurationBuilder poolConfig(GenericObjectPoolConfig poolConfig)

GenericObjectPoolConfig类可以new一个实例设置一下连接池参数。
接着思考,需要一个LettucePoolingClientConfigurationBuilder实例来调poolConfig。
LettucePoolingClientConfigurationBuilder怎么构造呢?注意仔细看下面图片,LettucePoolingClientConfigurationBuilder是接口LettucePoolingClientConfiguration中的类。
在这里插入图片描述
注意:LettucePoolingClientConfiguration接口有一个builder()方法可以返回一个LettucePoolingClientConfigurationBuilder。

那么,直接

LettucePoolingClientConfiguration.builder()

就可以得到LettucePoolingClientConfigurationBuilder。

LettucePoolingClientConfigurationBuilder有了。就可以设置连接池配置。

LettucePoolingClientConfigurationBuilder.poolConfig(GenericObjectPoolConfig poolConfig)

连一起就是:

//伪代码
LettucePoolingClientConfiguration.builder().poolConfig(GenericObjectPoolConfig poolConfig)

注意:返回的仍然是LettucePoolingClientConfigurationBuilder。可以继续配置其他数据。例如

//配置超时时间
.commandTimeout(Duration.ofMillis(timeout))

但是,得到的是LettucePoolingClientConfigurationBuilder。

那我需要的是一个LettuceClientConfiguration接口啊,怎么联系起来。看看它的子类,有一个子类接口:LettucePoolingClientConfiguration。可以用它LettucePoolingClientConfiguration来替代

看看LettucePoolingClientConfigurationBuilder类中有没有什么方法可以返回LettucePoolingClientConfiguration。巧了,看下图蓝色框框:build()方法。
在这里插入图片描述

参数2:LettuceClientConfiguration配置关键代码

//伪代码
LettucePoolingClientConfiguration.builder().poolConfig(GenericObjectPoolConfig poolConfig).build();

返回一个LettucePoolingClientConfiguration。是LettuceClientConfiguration的子类接口。
然后就可以实现一个LettuceConnectionFactory了。

步骤2:封装自定义的redis切库工具

实现一个自定义的RedisTemplate需要什么?

1)LettuceConnectionFactory连接池。上一节已经注入实现。这里直接作为自定义的redisUtil中的生成generateRedisTemplate的方法,作为参数传入。
2)设置key、value的序列化方式。传入参数keySerializer,valueSerializer。

RedisTemplate redisTemplate = new RedisTemplate();redisTemplate.setKeySerializer(keySerializer);
redisTemplate.setHashKeySerializer(keySerializer);
redisTemplate.setValueSerializer(valueSerializer);
redisTemplate.setHashValueSerializer(valueSerializer);

keySerializer类型是:RedisSerializer<?> , valueSerializer类型是:RedisSerializer<?> 。

3)注意:返回RedisTemplate实例前需要执行redisTemplate.afterPropertiesSet()来初始化bean。

切库关键代码

//切库
lettuceConnectionFactory.setDatabase(database);
lettuceConnectionFactory.afterPropertiesSet();
lettuceConnectionFactory.resetConnection();//传入LettuceConnectionFactory连接池对象
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.afterPropertiesSet();

步骤3:redis中读取List序列化的byte数组

利用上一节实现的自定义的RedisTemplate来实例化一个ByteArrayRedisTemplate<String, byte[]>。

实例化ByteArrayRedisTemplate<String, byte[]>关键步骤

keySerializer类型传入参数:RedisSerializer.string() , valueSerializer类型传入参数:RedisSerializer.byteArray()。

使用byteArrayRedisTemplate实例读取数据代码示例

例如:redis中数据类型是List< UserEventAction>实例进行序列化成的byte[]。

byte[] tmp = byteArrayRedisTemplate.opsForValue().get(prefix + userKey);
//读取后对数据进行反序列化后进行强转
List<UserEventAction> obj = (List<UserEventAction>) SerializeUtil.unserialize(tmp);

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

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

相关文章

redis的zset使用(java)——存取List< Object>

1 需求 要往redis存取List< Object>。 2 条件 1&#xff09;Object&#xff1a;是一个UserEvent对象&#xff0c;对应3个字段&#xff1a; Integer productId; String eventCode; Long timestamp;2&#xff09;要求 每个key里存取对象个数不超过xx个。 超过xx个&…

ogre研究之第一个程序(一)

第一次发送超过字数了&#xff0c;被迫剪成两篇&#xff01; 上一篇我们介绍了如何搭建开发环境&#xff0c;并创建了一个空白的窗口程序。 这里我们主要是实现在程序中装载一个简单的模型并显示出来。 首先看一下效果吧&#xff0c;&#xff08;模型就是ogre例子中的robot.mes…

英语生词本

英语生词本 1、daemon [di:mən] 守护进程2、phase [英] [feiz] 阶段, 时期3、methodology [英] [ˌmeθəˈdɔlədʒi:] 方法学,方法论4、algorithmalgorithm [英] [ˈlɡəriəm] [美] [ˈlɡəˌrɪəm] 运算法则2. 算法&#xff1b;演算法&#xff1b;计算程序3. 演示5、…

Executors源码解读——创建ExecutorService线程池

Executors源码解读——创建ExecutorService线程池〇、[源码版本] jdk 1.8一、线程池概述二、线程池创建三、Executors源码解读newFixedThreadPool()newWorkStealingPool()newSingleThreadExecutor()newCachedThreadPool()newSingleThreadScheduledExecutor()〇、[源码版本] jdk…

RIP,EIGRP,OSPF融合网络互通实验(原创)

首先看拓扑&#xff1a; 一个面试考官问我一个这样的问题&#xff0c;拓扑如上&#xff0c;为什么R1上的lo0 PING 不通 R6 上的lo0,说是一切都按正常配置&#xff0c;说是考我EIGRP的特性。我当然很纳闷&#xff0c;如果都正常配置怎么会不通呢&#xff0c;最后他告诉我主要是考…

谷歌A/B实验——重叠实验基础设施解读

谷歌A/B实验——重叠实验基础设施解读〇、来源一、背景介绍二、如何划分参数三、谷歌设计的ab实验系统3.1 域和层的设计3.1.1 基础重叠域和层设计3.1.2 具备非重叠和重叠的域和层设计3.1.2 具备非重叠的域的嵌套设计优点3.1.3 具备非重叠的域的嵌套设计缺点3.1.4 启动层&#x…

Mysql 5.7 创建索引官方解读

一、环境 Mysql 5.7 二、Mysql索引创建解读 1.概述 通常我们在使用CREATE TABLE时会创建所有的索引。索引的创建对于 InnoDB 表尤其重要&#xff0c;其中主键决定了数据文件中行的物理布局。 CREATE INDEX是另一种添加索引的方式&#xff0c;针对已经创建的表添加索引。注…

AspectJ切面自定义注解实现参数分组校验——基础概念(1)

AspectJ切面自定义注解实现参数分组校验——基础概念&#xff08;1&#xff09;一、环境二、validation-api源码解读2-1.Default源码解读2-2.valid源码解读2-3.Validation源码解读一、环境 maven 需要引入的依赖&#xff1a; <dependency><groupId>javax.valida…

主板跳线连接技巧图解

作为一名新手&#xff0c;要真正从头组装好自己的电脑并不容易&#xff0c;也许你知道CPU应该插哪儿&#xff0c;内存应该插哪儿&#xff0c;但遇到一排排复杂跳线的时候&#xff0c;很多新手都不知道如何下手。 钥匙开机其实并不神秘 还记不记得你第一次见到装电脑的时候…

为什么每个线程都需要创建一个栈?

有四个函数A、B、C、D&#xff0c;地址分别为100、200、300、400&#xff1b;有两个线程同时执行&#xff1b; 1&#xff09;假如只有一个栈 函数A在线程1中执行的时候&#xff0c;调用了函数B&#xff0c;将函数A中下一条指令的地址入栈&#xff08;104&#xff09;&#xff…

莎士比亚,肯尼迪总统,孔子,奥巴马总统,马克吐温,梵高,比尔盖茨等13位名人阔谈微博(中英双语版本)...

2019独角兽企业重金招聘Python工程师标准>>> 作者: ganzhijie 发表于 2010-09-02 10:11 原文链接 阅读: 21 评论: 0 John F. Kennedy-“Ask not what your twitter can do for you, ask what you can do for your twitter.”肯尼迪总统-“不要问你的微博能为你做些什…

centos 本地化配置

2019独角兽企业重金招聘Python工程师标准>>> 最近使用svn更新的时候经常出现一些奇怪的错误。经过查询得知是本地化环境没有配置&#xff0c;导致的。记录以下解决方法。 本人环境&#xff1a;centos 5.x 错误现象&#xff1a; [Copy to clipboard]View Code ERRORs…

MySQL连接查询

1.分类 MySQL连接可以分为&#xff1a; 1&#xff09;内连接 2&#xff09;外连接 左外连接右外连接全外连接 3&#xff09;自然连接 自然内连接(NATURAL JOIN)自然左外连接(NATURAL LEFT JOIN)自然右外连接(NATURAL RIGHT JOIN) 4&#xff09;交叉连接 2.语法 SELECT…

IP编址(包括网络地址和广播地址)

1.总述 IP地址使用32位二进数表示&#xff0c;每一个主机或路由器的接口都有全局唯一的IP地址&#xff08;NAT是个例外&#xff09;&#xff0c;它由网络号(NetID)和主机号(HostID)组成&#xff0c;它可以分为五类&#xff0c;如下&#xff1a; 2.地址划分 1&#xff09;A…

面试题:谈谈你对TCP的认识

一 TCP 1. 简介 首先&#xff0c;TCP是一个传输层协议&#xff0c;提供进程到进程之间的可靠性数据传输服务&#xff0c;还提供流量控制和差错控制等机制。 其次&#xff0c;TCP是面向连接的&#xff0c;其通信模式是全双工的&#xff1b;面向连接是指&#xff1a; 在发送数…

面试题:MySQL的innodb和myisam

一 Innodb 1. 简介 索引是一种排好序的用于快速查找的数据结构。 **根据官网手册InnoDB支持B-tree索引、聚簇索引(Clustered indexes)、全文索引(Full-text search indexes)、不支持hash索引&#xff08;InnoDB在内部利用哈希索引来实现其自适应哈希索引功能&#xff09…

用Markup Validation Service进行网页的W3C标准语法验证(c#)

W3C提供免费的Markup Validation Service&#xff0c;这是一个可以验证Html/XHtml文档的语法规范的公共服务。在某种程度上&#xff0c;有了它&#xff0c;我们再也不用为不能全面及时检测众多浏览器和五花八门的js/css不兼容性而痛不欲生了。^-^。 使用方法很简单&#xff0c;…

为什么MySQL索引更适合B+树而不是二叉树、B树

一 数据库为什么使用B树 1. 与二叉树相比 二叉树相比于顺序查找的确减少了查找次数&#xff0c;但是在最坏情况下&#xff0c;二叉树有可能退化为顺序查找。而且就二叉树本身来说&#xff0c;当数据库的数据量特别大时&#xff0c;其层数也将特别大。二叉树的高度一般是log_2…

MDOP套装之app-v安装使用及功能说明

最近尝试了瑞友天翼的虚拟化产品&#xff0c;感觉还不错&#xff0c;正好手上又下载了个mdop套装&#xff0c;顺手做了个app-v实验&#xff0c;其他实验教程后期继续推出。 一、服务端的安装 二、排序工具的安装 三、客户端的安装 四、使用排序工具虚拟化一个程序 五、发布虚…

容器技术之Dockerk8s知识笔记

本文带你快速了解Kubernetes与Docker 让你对容器与虚拟机的区别、Docker与k8s有一个快速的了解 目录 演变史容器与虚拟机的区别K8S与Docker概念DockerK8S演变史 传统部署时代&#xff1a; 早期&#xff0c;将单一的应用服务运行在物理服务器上&#xff0c;无法给服务器的应用…