Redis 操作多个数据库的配置的方法实现


Posted in Redis onMarch 23, 2022

前言

redis 默认有 0-16 号数据库,一般我们操作redis时,用的是 0号数据库,但是有时我们的项目想同时操作多个数据库,又不想每次访问其它库数据时 select 切换数据库,这样太繁琐。

因此我们需要配置多个Jedis Client,但是jedis是容易阻塞,效率不太好,所以我这边采用了 Lettuce Client,它是 Reactive 的连接方式,效率比较高。但是怎么使用到 Lettuce Client,其实一般我们添加  spring-boot-starter-data-redis  依赖,通过RedisTemplate 去使用Redis的功能时,当版本很高的时候默认RedisTemplate底层用的就是通过Lettuce Client 去建立连接和操作数据。

以下是自己实际正在使用的多数据源配置,且能正常运行。

一、添加pom 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

二、多数据源的配置和添加到spring容器中

下面我的截图使用了四个数据源,分别是1,2,3,4号库。

1)新建一个configuration 配置类

2)new RedisStandaloneConfiguration(host, port); 初始化一个Redis配置,并接下来选择好库号。

3)初始化一个 LettuceConnectionFactory 。

4)实例化一个 RedisTemplate ,并设置键值序列化的方式,这里key和value都是字符串的,所以序列化器选择  StringRedisSerializer。

5)给 RedisTemplate 设置第三步创建的 LettuceConnectionFactory,并以@Bean注解注入到spring容器中,使用时直接通过方法名字在spring容器中查找,装配到引用它的实例中。

import io.lettuce.core.resource.ClientResources;
import io.lettuce.core.resource.DefaultClientResources;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.ObjectUtils;
 
import java.time.Duration;
 
/**
* reactive redis
* @Author:wangqipeng
* @Date:14:38 2019-07-03
*/
 
@Configuration
public class RedisDatasourceConfiguration {
 
    @Value("${redis.isCleanRedisCache:false}")
    private String cleanRedisCache;
    @Value("${redis.host:127.0.0.1}")
    public String host;
    @Value("${redis.port:6379}")
    public Integer port;
    private String password;
 
    @Value("${redis.timeout:2000}")
    public Integer timeout;
    public Integer maxIdle = 16;
    public Integer minIdle = 5;
    public Integer maxTotal = 30;
 
 
    @Bean
    public RedisTemplate<String, String> stringRedisTemplate1() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
        configuration.setDatabase(1);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }
        return createRedisTemplate(creatFactory(configuration));
    }
 
    @Bean
    public RedisTemplate<String, String> stringRedisTemplate2() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
        configuration.setDatabase(2);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }
        return createRedisTemplate(creatFactory(configuration));
    }
    @Bean
    public RedisTemplate<String, String> stringRedisTemplate3() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
        configuration.setDatabase(3);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }
        return createRedisTemplate(creatFactory(configuration));
    }
    @Bean
    public RedisTemplate<String, String> stringRedisTemplate4() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
        configuration.setDatabase(4);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }
        return createRedisTemplate(creatFactory(configuration));
    }
 
    @Bean
    public RedisTemplate<String, String> stringRedisTemplate5() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(host, port);
        configuration.setDatabase(5);
        if (!ObjectUtils.isEmpty(password)) {
            RedisPassword redisPassword = RedisPassword.of(password);
            configuration.setPassword(redisPassword);
        }
        return createRedisTemplate(creatFactory(configuration));
    }
 
    private RedisTemplate<String, String> getSerializerRedisTemplate(){
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
 
    private RedisTemplate createRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, String> redisTemplate = getSerializerRedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    private GenericObjectPoolConfig getGenericObjectPoolConfig(){
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxTotal(maxTotal);
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMaxWaitMillis(timeout);
        return genericObjectPoolConfig;
    }
 
    private LettuceConnectionFactory creatFactory(RedisStandaloneConfiguration configuration){
        LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder = LettucePoolingClientConfiguration.builder();
        builder.poolConfig(getGenericObjectPoolConfig());
 
//        LettuceClientConfiguration.LettuceClientConfigurationBuilder builder = LettuceClientConfiguration.builder();
//        builder.clientResources(clientResources());
//        builder.commandTimeout(Duration.ofSeconds(3000));
        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(configuration, builder.build());
        connectionFactory.afterPropertiesSet();
        return connectionFactory;
    }
}

三、使用方式

Redis 操作多个数据库的配置的方法实现

这里引用是2号库,即上面通过@Bean 加载到spring容器中的。

结语:

通过看源码知道怎么配置多数据源,积累了一些经验。

到此这篇关于Redis 操作多个数据库的配置的方法实现的文章就介绍到这了,更多相关Redis 操作多数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis实现排行榜功能
May 24 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Redis集群的关闭与重启操作
Jul 07 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
Redis 哨兵机制及配置实现
Mar 25 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis安装使用RedisJSON模块的方法
Mar 23 #Redis
解决redis批量删除key值的问题
Mar 23 #Redis
源码分析Redis中 set 和 sorted set 的使用方法
Redis监控工具RedisInsight安装与使用
在Centos 8.0中安装Redis服务器的教程详解
redis数据结构之压缩列表
Mar 21 #Redis
Redis高可用集群redis-cluster详解
You might like
留言板翻页的实现详解
2006/10/09 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
javascript 函数速查表
2010/02/07 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
python实现数组插入新元素的方法
2015/05/22 Python
Python Grid使用和布局详解
2018/06/30 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python Pillow图像处理方法汇总
2019/10/16 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
演讲比赛策划方案
2014/06/11 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
新生开学寄语大全
2015/05/28 职场文书
活动新闻稿范文
2015/07/17 职场文书
九年级历史教学反思
2016/02/19 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL