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 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
May 08 Redis
详解redis分布式锁的这些坑
May 19 Redis
redis实现共同好友的思路详解
May 26 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 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
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
PHP错误处理函数
2016/04/03 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python日志logging模块使用方法分析
2019/05/23 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
大学军训感想
2014/02/12 职场文书
高一学生期末评语
2014/04/25 职场文书
入职担保书范文
2014/05/21 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python