java连接腾讯云上的redis
目录
- 腾讯云上的配置
- redis连接单机和集群
- 依赖 pom.xml
- redis参数的配置文件
- 遗留问题
腾讯云上的配置
在安全组上打开相关的端口即可
"来源" 就是你的目标服务器的ip(也可以是0.0.0.0/0) 协议端口可以用范围的写法 TCP:6379-6389
然后需将redis运行使用的配置文件redis.conf默认bind 127.0.0.1(只允许本地访问)注释掉(或者改为0.0.0.0)
# bind 127.0.0.1
protected-mode no 从yes改为no
redis连接单机和集群
依赖 pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- redis依赖commons-pool 这个依赖一定要添加 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version>
</dependency>
redis参数的配置文件
redis.properties
#启动集群
#redis.cluster=true########################### reids单机配置 ##############################
#Matser的ip地址
redis.host=49.235.196.22
#端口号
redis.port=6380
#如果有密码
#redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=5000########################### jedis单机与集群的公共配置 ##############################
#最大空闲数
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#在空闲时检查有效性, 默认false
redis.testWhileIdle=true########################### redis集群配置 ##############################
redis.clusterNodes=49.235.196.22:7001,49.235.196.22:7002,49.235.196.22:7003,49.235.196.22:7004,49.235.196.22:7005,49.235.196.22:7006
redis.maxRedirects=3#哨兵模式
#redis.sentinel.host1=192.168.177.128
#redis.sentinel.port1=26379#redis.sentinel.host2=172.20.1.231
#redis.sentinel.port2=26379
application.yml
redis:cluster:true
三个Redis的配置类,RedisConfig:集群和单机的公共部分,SinglenRedisConfig单机特有的配置,ClusterRedisConfig集群特有的配置
package per.qiao.config;import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;import java.util.List;/*** Create by IntelliJ Idea 2018.2** @author: qyp* Date: 2019-09-29 17:15*/
@Getter
@Setter
public abstract class RedisConfig {/*** 最大空闲数*/public Integer maxIdle;/*** 控制一个pool可分配多少个jedis实例*/public Integer maxTotal;/*** 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。*/public Integer maxWaitMillis;/*** 连接的最小空闲时间 默认1800000毫秒(30分钟)*/public Integer minEvictableIdleTimeMillis;/*** 每次释放连接的最大数目,默认3*/public Integer numTestsPerEvictionRun;/*** 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1*/public long timeBetweenEvictionRunsMillis;/*** 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个*/public boolean testOnBorrow;/*** 在空闲时检查有效性, 默认false*/public boolean testWhileIdle;/*** JedisPoolConfig 连接池** @return*/@Beanpublic JedisPoolConfig jedisPoolConfig() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大空闲数jedisPoolConfig.setMaxIdle(maxIdle);// 连接池的最大数据库连接数jedisPoolConfig.setMaxTotal(maxTotal);// 最大建立连接等待时间jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);// 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);// 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个jedisPoolConfig.setTestOnBorrow(testOnBorrow);// 在空闲时检查有效性, 默认falsejedisPoolConfig.setTestWhileIdle(testWhileIdle);return jedisPoolConfig;}/*** 单机构建JedisConnectionFactory对象* @param jedisPoolConfig* @return*/public JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {return null;}/*** 集群redis构建JedisConnectionFactory对象* @param jedisPoolConfig* @param redisClusterConfiguration* @return*/public JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisClusterConfiguration redisClusterConfiguration) {return null;}/*** 实例化 RedisTemplate 对象** @return*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();initDomainRedisTemplate(redisTemplate, redisConnectionFactory);return redisTemplate;}/*** 设置数据存入 redis 的序列化方式,并开启事务** @param redisTemplate* @param factory*/public void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 开启事务//redisTemplate.setEnableTransactionSupport(true);redisTemplate.setConnectionFactory(factory);}
}
SinglenRedisConfig.java
package per.qiao.config;import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import redis.clients.jedis.JedisPoolConfig;/*** PropertySource加载文件到当前类上下文的 Environment 中*/
@Configuration
@PropertySource("classpath:redis.properties")
@ConfigurationProperties(prefix = "redis")
@ConditionalOnMissingBean(ClusterRedisConfig.class)
@Getter
@Setter
public class SinglenRedisConfig extends RedisConfig {/*** host,port,timeout* 这三个是单机属性*/private String host;private Integer port;private Integer timeout;/*** 单机版配置** @param @param jedisPoolConfig* @param @return* @return JedisConnectionFactory* @throws* @Title: JedisConnectionFactory* @autor lpl* @date 2018年2月24日*/@Beanpublic JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();//连接池 redisConnectionFactory.setPoolConfig(jedisPoolConfig);//IP地址 redisConnectionFactory.setHostName(host);//端口号 redisConnectionFactory.setPort(port);//如果Redis设置有密码 //JedisConnectionFactory.setPassword(password);//客户端超时时间单位是毫秒 redisConnectionFactory.setTimeout(timeout);return redisConnectionFactory;}
}
ClusterRedisConfig.java
package per.qiao.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPoolConfig;import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;/*** @author qiao*/
@Configuration
@PropertySource("classpath:redis.properties")
//@EnableConfigurationProperties(ClusterRedisConfig.class)
@ConfigurationProperties(prefix = "redis")
//@ConditionalOnExpression("#{'true'.equals(environment['redis.cluster'])}")
//@ConditionalOnExpression("'${redis.cluster}'=='true'")
@ConditionalOnExpression("${redis.cluster}")
@Getter
@Setter
public class ClusterRedisConfig extends RedisConfig {/*** clusterNodes,mmaxRedirectsac* 这两个是集群属性*/private List<String> clusterNodes;private Integer maxRedirects;/*** Redis集群的配置** @return RedisClusterConfiguration* @throws* @autor lpl* @date 2017年12月22日*/@Beanpublic RedisClusterConfiguration redisClusterConfiguration() {RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();Set<RedisNode> nodes = clusterNodes.stream().map(ipPort -> {String[] ipAndPort = ipPort.split(":");return new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1]));}).collect(Collectors.toSet());redisClusterConfiguration.setClusterNodes(nodes);redisClusterConfiguration.setMaxRedirects(maxRedirects);return redisClusterConfiguration;}/*** 配置工厂** @param @param jedisPoolConfig* @param @return* @return JedisConnectionFactory* @throws* @Title: JedisConnectionFactory* @autor lpl* @date 2017年12月22日*/@Beanpublic JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisClusterConfiguration redisClusterConfiguration) {JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig);return redisConnectionFactory;}}
测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisTest {@AutowiredRedisUtil redisUtil;@Testpublic void test() {//redisUtil.del("abc");redisUtil.set("abc", "1234567");System.out.println("================");Object myKey = redisUtil.get("abc");System.out.println(myKey);}
}
遗留问题
问题1:在集群配置上出了个问题ClusterRedisConfig
问题一、使用@PropertySource("classpath:redis.properties")加载配置文件,然后使用@ConditionalOnExpression获取不到配置文件中的值使用@PropertySource("classpath:redis.properties")加载指定的属性文件,然后使用@ConfigurationProperties(prefix = "redis")指定前缀,最后使用@ConditionalOnExpression("${redis.cluster}")判断是否加载当前类但是这个判断不能按照设想进行控制。1. 当我将属性redis.cluster放到redis.properties中时,获取不到值,抛there is still more data in the expression in 'lcurly({)'错误
2. 当我把属性redis.cluster放到application.yml文件中时,是可以成功的。猜想:yml文件最先加载,@ConditionalOnExpression又比@PropertySource先加载,所以拿不到数据
问题2:在使用lettuce连接redis时,项目总是报集群的连接超时,但是项目可以正常使用
这是使用lettuce(生菜)连接的yml配置文件
spring:redis:database: 1# host:# port:# password:cluster:nodes:- 49.235.196.22:7001- 49.235.196.22:7002- 49.235.196.22:7003- 49.235.196.22:7004- 49.235.196.22:7005- 49.235.196.22:7006lettuce:pool:# 连接池最大连接数 默认8 ,负数表示没有限制max-active: 8# 连接池中的最大空闲连接 默认8max-idle: 8# 连接池中的最小空闲连接 默认0min-idle: 0# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1max-wait: -1shost: 49.235.196.22port: 7001#timeout: 30000s
这是配置类
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig2 {/*** springboot2.x 使用LettuceConnectionFactory 代替 RedisConnectionFactory* application.yml配置基本信息后,springboot2.x RedisAutoConfiguration能够自动装配* LettuceConnectionFactory 和 RedisConnectionFactory 及其 RedisTemplate* @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory){RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}
参考
转载于:https://www.cnblogs.com/qiaozhuangshi/p/11611237.html
java连接腾讯云上的redis相关推荐
- 【总结】本地springboot连接腾讯云Redis
学习Redis时,SpringBoot整合Redis想试试连接腾讯云上的. 网上找了半天,试了很多方法,下面是成功案例 1. 修改redis.conf文件, 解除绑定本地ip, 并且关闭保护模式 注释 ...
- 腾讯云对象存储的完整教程,java将文件上传到腾讯云上后返回可以访问的连接
先前使用的是七牛云,是挺好用的,但是七牛对于测试域名有一个月的时间限制.测试域名失效后上传的图片等文件就不能访问了.但是腾讯云每个注册的账户有50G的对象存储的空间.而且没有时间限制.所以就采用腾讯的 ...
- 远程连接 腾讯云 redis 服务器
今天有需求,本地远程连接 腾讯云redis 服务器,服务器运维知识有限,搜索了不少文章,总算尝试出来了,记录下.(模模糊糊记得之前好像操作 aliyun 就做过类似这种的)参考文章:https://c ...
- 连接腾讯云服务器操作+SCP上传文件
1.连接腾讯云服务器 linux打开终端(windows打开cmd) ssh -i "<下载的与云服务器关联的私钥的绝对路径>" <username>@&l ...
- 一键搭建微信小程序开发环境 及demo运行(腾讯云上一键搭建node.js服务器环境,PHP,Java,.NET服务类似)
一.首先准备下本地环境(本地就需要一个微信开发工具) 1.首先得有一个微信小程序账号,登陆微信小程序首页:mp.weixin.qq.com,点击右上角立即注册. 注册登陆后,首页填写一些小程序基本信息 ...
- STM32节点移植lorawan协议连接腾讯云物联网开发平台(IoT Explorer)
STM32移植lorawan协议栈连接腾讯云物联网开发平台(IoT Explorer) 前言 开发环境的准备 正文 初始化 入网 发送与接收 前言 在移植协议之前,先给大家科普一下Lora 和 lor ...
- java集成腾讯云COS
@RequestMapping(value = "/test", method = RequestMethod.POST)@ResponseBodypublic String te ...
- 在腾讯云上创建您的SQL Cluster(3)
2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由李斯达原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/communi ...
- 如何在腾讯云上安装Cloud Foundry
Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架.语言.运行时环境.云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的 ...
最新文章
- 网易云信携手房天下打造高质量音视频会议
- python unicodedecodeerror_如何解决python UnicodeDecodeError问题?
- 字符串匹配算法(Trie树)
- 基坑监测日报模板_基坑监测有多重要?实录基坑坍塌过程,不亲身经历,不知道现场有多恐怖!...
- 武汉市江岸区2021年高考成绩查询,2021年武汉各区一、二、三批次高中有哪些(名单)...
- [20161128]关于Little Enddian.txt
- C#随机不重复给数组赋值1-100并排序
- 为什么关于反趋势交易的书以及文章很少?
- 使用LR11过程中遇到的一些问题汇总
- Python 利用GDAL对图像进行几何校正
- 京东员工p级别分几级_一文揭秘字节跳动、华为、京东的薪资职级
- matlab求多元函数微积分,中北大学高等数据MATLAB验证性实验7多元函数微积分学MATLAB实验报告格式...
- mysql按照音序排列_如何按音序排列
- Windows小工具 tcping
- 常用Alink协议总结
- 接受自己平庸真的很难吗?你知道163邮箱登陆界面是什么吗?
- NFC应用(二)读写器模式
- 2020年中国废旧纺织品回收行业市场现状分析,高值化再生技术持续推进「图」
- 【UVA】【11021】麻球繁衍
- 如何批量重命名图片,文档,文件夹名字 Windows CMD 批量修改文件名字 内含修改路径的操作,想改哪里改哪里!