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如何一键部署脚本
Apr 12 Redis
Redis安装启动及常见数据类型
Apr 14 Redis
详解redis分布式锁的这些坑
May 19 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis高并发缓存架构性能优化
May 15 Redis
解决 redis 无法远程连接
May 15 Redis
Redis实现短信验证码登录的示例代码
Jun 14 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
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
vue 中自定义指令改变data中的值
2017/06/02 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
企划专员岗位职责
2013/12/09 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
会计岗位职责范本
2015/04/02 职场文书
深入理解python多线程编程
2021/04/18 Python
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers