目录

  • 腾讯云上的配置
  • 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相关推荐

  1. 【总结】本地springboot连接腾讯云Redis

    学习Redis时,SpringBoot整合Redis想试试连接腾讯云上的. 网上找了半天,试了很多方法,下面是成功案例 1. 修改redis.conf文件, 解除绑定本地ip, 并且关闭保护模式 注释 ...

  2. 腾讯云对象存储的完整教程,java将文件上传到腾讯云上后返回可以访问的连接

    先前使用的是七牛云,是挺好用的,但是七牛对于测试域名有一个月的时间限制.测试域名失效后上传的图片等文件就不能访问了.但是腾讯云每个注册的账户有50G的对象存储的空间.而且没有时间限制.所以就采用腾讯的 ...

  3. 远程连接 腾讯云 redis 服务器

    今天有需求,本地远程连接 腾讯云redis 服务器,服务器运维知识有限,搜索了不少文章,总算尝试出来了,记录下.(模模糊糊记得之前好像操作 aliyun 就做过类似这种的)参考文章:https://c ...

  4. 连接腾讯云服务器操作+SCP上传文件

    1.连接腾讯云服务器 linux打开终端(windows打开cmd) ssh -i "<下载的与云服务器关联的私钥的绝对路径>" <username>@&l ...

  5. 一键搭建微信小程序开发环境 及demo运行(腾讯云上一键搭建node.js服务器环境,PHP,Java,.NET服务类似)

    一.首先准备下本地环境(本地就需要一个微信开发工具) 1.首先得有一个微信小程序账号,登陆微信小程序首页:mp.weixin.qq.com,点击右上角立即注册. 注册登陆后,首页填写一些小程序基本信息 ...

  6. STM32节点移植lorawan协议连接腾讯云物联网开发平台(IoT Explorer)

    STM32移植lorawan协议栈连接腾讯云物联网开发平台(IoT Explorer) 前言 开发环境的准备 正文 初始化 入网 发送与接收 前言 在移植协议之前,先给大家科普一下Lora 和 lor ...

  7. java集成腾讯云COS

    @RequestMapping(value = "/test", method = RequestMethod.POST)@ResponseBodypublic String te ...

  8. 在腾讯云上创建您的SQL Cluster(3)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由李斯达原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communi ...

  9. 如何在腾讯云上安装Cloud Foundry

    Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架.语言.运行时环境.云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的 ...

最新文章

  1. 网易云信携手房天下打造高质量音视频会议
  2. python unicodedecodeerror_如何解决python UnicodeDecodeError问题?
  3. 字符串匹配算法(Trie树)
  4. 基坑监测日报模板_基坑监测有多重要?实录基坑坍塌过程,不亲身经历,不知道现场有多恐怖!...
  5. 武汉市江岸区2021年高考成绩查询,2021年武汉各区一、二、三批次高中有哪些(名单)...
  6. [20161128]关于Little Enddian.txt
  7. C#随机不重复给数组赋值1-100并排序
  8. 为什么关于反趋势交易的书以及文章很少?
  9. 使用LR11过程中遇到的一些问题汇总
  10. Python 利用GDAL对图像进行几何校正
  11. 京东员工p级别分几级_一文揭秘字节跳动、华为、京东的薪资职级
  12. matlab求多元函数微积分,中北大学高等数据MATLAB验证性实验7多元函数微积分学MATLAB实验报告格式...
  13. mysql按照音序排列_如何按音序排列
  14. Windows小工具 tcping
  15. 常用Alink协议总结
  16. 接受自己平庸真的很难吗?你知道163邮箱登陆界面是什么吗?
  17. NFC应用(二)读写器模式
  18. 2020年中国废旧纺织品回收行业市场现状分析,高值化再生技术持续推进「图」
  19. 【UVA】【11021】麻球繁衍
  20. 如何批量重命名图片,文档,文件夹名字 Windows CMD 批量修改文件名字 内含修改路径的操作,想改哪里改哪里!

热门文章

  1. 【网络流24题】试题库问题
  2. JavaScript中的继承
  3. C++设计模式——简单工厂模式
  4. WebService与使用风格RPC/SOA/REST
  5. 行人检测 读书笔记 综述
  6. 嵌入式ARM多核处理器并行化方法
  7. Twitter是如何做到每秒处理3000张图片的?
  8. iOS iOS-System-Services(系统信息)
  9. 企业IM优劣势对比调查 各有特点
  10. Creating-Observables