SpringBoot整合redis(StringRedisTemplate),操作一个redis服务器的多个库
介绍
在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis
SpringBoot 2.x后 ,原来底层使用的 Jedis 被 lettuce[赖忒死] 替换。所以在springboot中引入spring-boot-starter-data-redis
依赖时,默认使用的时Lettuce。
jedis:采用的直连,多个线程操作的话,是不安全的。如果要避免不安全,使用jedis pool连接池!更像BIO模式(阻塞模式)。
lettuce:采用netty(高性能网络框架,异步请求),实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数量了,更像NIO模式。
而我们要是使用的是StringRedisTemplate 而不是 RedisTemplate
StringRedisTemplate是RedisTemplate的子类(不代表value只能是string,而是序列化策略为StringRedisSerializer)
- RedisTemplate默认采用的是JDK的序列化策略,即JdkSerializationRedisSerializer,保存的key和value都是采用此策略序列化保存的。比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面,当然从Redis获取数据的时候也会默认将数据当做字节数组转化。
- StringRedisTemplate的API假定所有的数据类型化都是字符类型,即key和value都是字符串类型。默认采用的是String的序列化策略,即StringRedisSerializer,保存的key和value都是采用此策略序列化保存的。
作用
redis连接数据库,可以实现排行榜(有序集合),缓存(字符串类型)等功能
快速开始
导入依赖
<!--redis场景启动器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis 连接池 -->
<!--新版本连接池lettuce-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
配置文件
#****************************redis****************************
# Redis数据库索引(默认为0)
redis: database:# 默认库default: 0# 缓存库cache: 1# 排行榜库sort: 2# 搜索历史的库history: 3spring:redis:host: 127.0.0.1lettuce:pool:# 连接池最大连接数(使用负值表示没有限制)max-active: 20# 连接池中的最大空闲连接max-idle: 10# 连接池中的最小空闲连接min-idle: 5# 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: 5000# Redis服务器连接密码(默认为空,代表没有密码)password: 10401# Redis服务器连接端口port: 6379# 连接超时时间(毫秒)timeout: 5000
配置类
import io.lettuce.core.resource.DefaultClientResources;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.springframework.beans.factory.annotation.Qualifier;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.RedisPassword;import org.springframework.data.redis.connection.RedisStandaloneConfiguration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.util.ObjectUtils;import java.time.Duration;@Configurationpublic class RedisConfig {@Value("${redis.database.default}")private int defaultDataBase;@Value("${redis.database.sort}")private int sortDataBase;@Value("${redis.database.cache}")private int drugCacheDataBase;@Value("${redis.database.history}")private int historyDataBase;@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.lettuce.pool.max-active}")private int maxActive;@Value("${spring.redis.lettuce.pool.max-wait}")private int maxWait;@Value("${spring.redis.lettuce.pool.max-idle}")private int maxIdle;@Value("${spring.redis.lettuce.pool.min-idle}")private int minIdle;@Value("${spring.redis.timeout}")private long timeout; /*** 配置redis连接池*/@Beanpublic GenericObjectPoolConfig poolConfig() {GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxTotal(maxActive);poolConfig.setMaxIdle(maxIdle);poolConfig.setMinIdle(minIdle);poolConfig.setMaxWaitMillis(maxWait);return poolConfig;} /*** 配置默认客户端资源*/@Bean("defaultClientResources")public DefaultClientResources getDefaultClientResources(){return DefaultClientResources.create();}private StringRedisTemplate getStringRedisTemplate(int database, GenericObjectPoolConfig poolConfig, DefaultClientResources defaultClientResources) {// 构建工厂对象RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();config.setHostName(host);config.setPort(port);if (!ObjectUtils.isEmpty(password)) {RedisPassword redisPassword = RedisPassword.of(password);config.setPassword(redisPassword);}LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder().commandTimeout(Duration.ofSeconds(timeout)).poolConfig(poolConfig).clientResources(defaultClientResources).build();LettuceConnectionFactory factory = new LettuceConnectionFactory(config, clientConfig);// 设置使用的redis数据库factory.setDatabase(database);// 重新初始化工厂factory.afterPropertiesSet();return new StringRedisTemplate(factory);}@Bean(name="redisTemplateDefault")public StringRedisTemplate redisTemplateDefault(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(defaultDataBase, poolConfig,defaultClientResources);}@Bean(name="redisTemplateSort")public StringRedisTemplate redisTemplateSort(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(sortDataBase, poolConfig,defaultClientResources);}@Bean(name="redisTemplateDrugCache")public StringRedisTemplate redisTemplateCacheDrug(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(drugCacheDataBase, poolConfig,defaultClientResources);}@Bean(name="redisTemplateHistory")public StringRedisTemplate redisTemplateHistory(GenericObjectPoolConfig poolConfig,@Qualifier("defaultClientResources") DefaultClientResources defaultClientResources) {return getStringRedisTemplate(historyDataBase, poolConfig,defaultClientResources);}}
一总往Spring容器注入了四个StringRedisTemplate对象,分别对应操作不同的库
使用
指定名称的从IOC容器获取,因为配置了多个对象
@Resource(name = "redisTemplateDefault")
private StringRedisTemplate stringRedisTemplate;
SpringBoot整合redis(StringRedisTemplate),操作一个redis服务器的多个库相关推荐
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...
SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例...
SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 1.前言 本文主要介绍使用SpringBoot与shiro实现基 ...
- SpringBoot整合JDBC数据库操作第七弹-自定义RowMapper
SpringBoot整合JDBC数据库操作第七弹-自定义RowMapper 上篇文章我们讲到了怎么对数据的查询操作,每次查询数据都会在返回中构建一个匿名类去封装返回结果,这样的话导致我们有大量的冗余代 ...
- SpringBoot整合JDBC数据库操作第二弹-配置基本数据库连接源
SpringBoot整合JDBC数据库操作第二弹-配置基本数据库连接源 上篇文章我们讲到了如何配置整合JDBC的基础环境,这篇文章我们讲解一下如何去配置服务的DataSource数据库数据源,方便其对 ...
- Redis数据操作(redis入门)
一.字符串类型 在redis里面有一个特别重要的命令"keys",可以进行全部数据的列出. 1.设置新的数据: set username-dlnu hello; 2.取得对应的数据 ...
- redis常用操作2, redis操作键值, redis安全设置
string数据 127.0.0.1:6379> setnx k1 888 #键存在,setnx检测到,不会覆盖: (integer) 0 127.0.0.1:6379> get k1 & ...
- maven netty 配置_使用Springboot整合开发Netty(一个表白的小案例)
写了很久的java并发包里面的文章,今天换一个口味.很早之前学的Netty,由于最近项目经常使用到,遇到了很多坑,因此想通过一个体系教程说一下这个高性能异步通信框架Netty,这也是netty的第一篇 ...
- SpringBoot 整合activiti5.22 实现一个完整的请假流程
最近在熟悉activiti的使用,翻阅了很多资料,自己也整理了一点出来方便以后自己使用 一.引入依赖 <dependencies><dependency><groupId ...
- springboot整合通用mapper操作数据库
1. 建表sql create table user (`id` int PRIMARY KEY auto_increment COMMENT '用户id', `name` VARCHAR(255) ...
最新文章
- JAVA产生加密公钥私钥_Java生成非对称型加密的公钥和私钥
- python中关于list列表的增删查改操作
- ubuntu apt-get dpkg应用中的一些问题及解决方法
- css 横线_CSS-画一个太极阴阳图
- python后端开发工程师面试题
- x shell 配置 和相关注意点(vm相关注意点)
- 在VS2003下把一个DataTable Update 到数据库
- 程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**
- 小米发布会之文案错误:大哥你先处罚自己!再处罚相关高管!
- 移动端:zepto框架
- 开源免费录屏和直播软件OBS Studio教程
- 基于java jsp企业人事管理系统mysql
- 360浏览器显示服务器拒绝连接,360浏览器提示“您与此网站之间建立的连接不安全完美解决方法...
- Hibernate入门简介----张冬
- Linux使用sendmail邮件监控[运维监控]
- K210使用MaixPy IDE长时间显示连接中的解决方案
- kibana监控logstash
- 广西大学计算机考研资料汇总
- Android多点触控之——MotionEvent(触控事件)
- LayUI # 清空下拉框的值