封装自定义的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);

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

  1. java字符串替换 数组,Java工具类-拆分字符串组装数组,替换字符

    Java工具类--拆分字符串组装数组,替换字符 >>>>>>>>>>>>>>>>>>> ...

  2. Redis存储缓存工具类简单封装

    一.公共实体类 (1)User.java package cn.xiyou.entity;import java.io.Serializable;/*** User实体* * @author XIOA ...

  3. Redis使用及工具类

    原地址:https://www.cnblogs.com/wyy123/p/6078593.html [学会安装redis] 从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后 ...

  4. redis分布式锁工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.core. ...

  5. 「问题解决」java web项目打成jar包运行后工具类无法读取模板文件的解决方法

    介绍语 本号主要是Java常用关键技术点,通用工具类的分享:以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+d ...

  6. 用第三方工具类,将JavaBean、List、MapString,Object转成JSON文本

    导入第三方jar包: >commons-beanutils-1.7.0.jar >commons-collections-3.1.jar >commons-lang-2.5.jar ...

  7. java properties文件 安全_java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] | 学步园...

    java 数据库读取工具类(读取config.properties配置文件)[包含线程安全] 数据库读取工具类 package com.db; import java.sql.Connection; ...

  8. Arrays工具类和二维数组

    一.数组的更多内容 1.1 Arrays工具类 JDK提供的java.util.Arrays工具类,包含了常用的数组操作,方便我们日常开发.Arrays类包含了:排序.查找.填充.打印内容等常见的操作 ...

  9. 将字符串,数组等任意格式转为json(JSON)数据,Arrays是数组工具类,将任意数组转字符串或数组操作

    1:将字符串数据转json数组返回给前端,注意使用的类是alibaba的 import com.alibaba.fastjson.JSONArray; JSONArray.parse(String t ...

最新文章

  1. 谷歌最强 NLP 模型 BERT 解读
  2. 伯努利分布方差_统计知识(4)——分布
  3. LCS(最长公共子串)系列问题
  4. boost::uuid::string_generator相关的测试程序
  5. 人工智能、机器学习和深度学习的区别?
  6. IOS15.0的适配
  7. [转]LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
  8. 一个USB HUB电路分享
  9. Nexus 3.31.1-01搭建 maven 私服 windows
  10. 【JAVA基础篇】反射
  11. JS的三大组成(ES,DOM,BOM)
  12. mysql dba环境验收_面对一个全新的环境,作为一个Mysql DBA,应该了解
  13. 自学python好找工作么-非计算机专业自学Python好找工作吗?
  14. MooseFs的使用与操作
  15. PyCharm2021设置成中文版
  16. 两台电脑服务器文件同步,多台电脑怎么实现数据同步
  17. GMP法规附录《计算机化系统》那些事儿
  18. 如何有效破解PDF文件的密码?
  19. 分了很多节的word文档,使用尾注插入的参考文献,最后怎么在参考文献之后加入致谢?
  20. 大数据分析技术种类与应用

热门文章

  1. 一个前端框架应该有的一些公共函数
  2. data.frame类型数据如何将第一列值替换为行号
  3. 关于HTML5标签不兼容(IE6~8)
  4. 《APUE》第6章笔记
  5. C#非泛型集合类-使用HashTable组织数据
  6. python有哪些常用的package_个人Python常用Package及其安装
  7. python科赫曲线绘制正方形_Python数据处理从零开始----第四章(可视化)(14)使用seaborn绘制热图...
  8. linux中断处理模式,Linux在保护模式下的中断处理分析.pdf
  9. [转载] 详解Java中静态方法
  10. [转载] 解析Java的JNI编程中的对象引用与内存泄漏问题