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

代码环境

框架: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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值