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 08 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
浅谈Redis的几个过期策略
May 27 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
嵌入式Redis服务器在Spring Boot测试中的使用教程
Jul 21 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 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
牡丹941资料
2021/03/01 无线电
PHP邮件专题
2006/10/09 PHP
PHP实现多条件查询实例代码
2010/07/17 PHP
php 操作调试的方法
2012/07/12 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
keep-alive保持组件状态的方法
2020/12/02 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python实现拓扑排序的基本教程
2018/03/11 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python实现简单http服务器功能
2018/09/17 Python
Python正则表达式指南 推荐
2018/10/09 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
python 将Excel转Word的示例
2021/03/02 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
大学生个人自我鉴定
2013/12/03 职场文书
数学系个人求职信范文
2014/01/30 职场文书
企业宗旨标语
2014/06/10 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
ztree+ajax实现文件树下载功能
2021/05/18 Javascript