配置文件和配置类

@Data
@Configuration
@ConfigurationProperties("jedis-config")
public class JedisConfigure { @Value("maxtotal")
private String maxTotal;
@Value("maxidle")
private String maxIdle;
@Value("minidle")
private String minIdle;
@Value("host")
private String host;
@Value("port")
private String port;
@Value("nodes")
private Set<String> nodes;
@Value("master-name")
private String masterName;
@Value("timeout")
private String timeout;
}
//配置文件 放在application.yml
jedis-config:
maxtotal: 100
host: 127.0.0.1
port: 6379
maxidle: 100
minidle: 0
master-name: mymaster
nodes:
- 127.0.0.1:7001
- 127.0.0.1:7002
- 192.168.1.98:7003
- 192.168.1.98:7004
- 192.168.1.20:7005
- 192.168.1.20:7006

  一、定义jedis接口

public interface IJedisService {

    /**
* 获取Jedis连接
* @return JedisCommands
*/
JedisCommands getJedis(); /**
* 释放连接
* @param jedis
*/
void jedisClose(JedisCommands jedis); /**
* 关闭连接池
*/
void jedisPoolClose();
}

  二、定义IJedisService的实现类

@EnableConfigurationProperties(JedisConfigure.class)
public class AbstractRedisService implements IJedisService { Pool<Jedis> jedisPool; @Autowired
private JedisConfigure jedisConfigure; /**
* jedis连接池配置类
*/
public GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig(); /**
* 初始化Jedis连接池配置
*/
@PostConstruct
public void initJedisPoolConfig() { jedisPoolConfig.setMaxTotal(Integer.parseInt(jedisConfigure.getMaxTotal()));
jedisPoolConfig.setMaxIdle(Integer.parseInt(jedisConfigure.getMinIdle()));
jedisPoolConfig.setMinIdle(Integer.parseInt(jedisConfigure.getMinIdle()));
jedisPoolConfig.setJmxEnabled(true);
jedisPoolConfig.setBlockWhenExhausted(true);
jedisPoolConfig.setTestOnBorrow(true);
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setMaxWaitMillis(-1);
} /**
* 初始化线程池
* 根据Class类型初始化
* @param clazz
* @return
*/
public void initJedisPool(Class clazz) { //Single
if (JedisPool.class.getName().equals(clazz.getName()))
jedisPool = new JedisPool(jedisPoolConfig, jedisConfigure.getHost(),
Integer.parseInt(jedisConfigure.getPort()), 100000);
//Sentinel
if (JedisSentinelPool.class.getName().equals(clazz.getName()))
jedisPool = new JedisSentinelPool(jedisConfigure.getMasterName(),
jedisConfigure.getNodes(), jedisPoolConfig, 100000); } @Override
public JedisCommands getJedis() {
Jedis jedis = jedisPool.getResource();
return jedis;
} @Override
public void jedisClose(JedisCommands jedis) { jedisPool.returnResource((Jedis) jedis);
} @Override
public void jedisPoolClose() {
if (!jedisPool.isClosed()) jedisPool.close();
}
}

  三、单机模式的具体实现

public class JedisSingleService extends AbstractRedisService {

    @PostConstruct
private void loadJedisPool() {
super.initJedisPool(JedisPool.class);
}
}

  四、Sentinel模式的具体实现

public class JedisSentinelService extends AbstractRedisService {

    @PostConstruct
private void loadJedisPool() {
super.initJedisPool(JedisSentinelPool.class);
}
}

  五、Cluster模式的具体实现

@Slf4j
@EnableConfigurationProperties(JedisConfigure.class)
public class JedisClusterService extends AbstractRedisService { @Autowired
private JedisConfigure jedisConfigure; JedisCluster jedis; /**
* 初始化配置
*/
@PostConstruct
private void initJedisCluster() { //初始化一般配置
super.initJedisPoolConfig(); //初始化JedisCluster
Set<HostAndPort> clusterHostMap = Sets.newHashSet();
initHostMap(clusterHostMap, jedisConfigure.getNodes());
jedis = new JedisCluster(clusterHostMap, jedisPoolConfig);
} /**
* 节点转换
*
* @param clusterHostMap
* @param nodes
*/
private void initHostMap(Set<HostAndPort> clusterHostMap, Set<String> nodes) {
if (clusterHostMap == null)
return;
try {
for (String node : nodes) { log.info("初始化Redis-Cluster集群 --- [{}]", node);
String[] nodeInfo = node.split(":"); String ip = nodeInfo[0];
Integer port = Integer.parseInt(nodeInfo[1]); HostAndPort hostAndPort = new HostAndPort(ip, port);
clusterHostMap.add(hostAndPort);
}
} catch (Exception e) {
throw new RuntimeException("redis-->Cluster集群节点配置异常");
}
} @Override
public JedisCommands getJedis() {
return jedis;
} @Override
public void jedisClose(JedisCommands jedis) { try {
((JedisCluster) jedis).close();
} catch (IOException e) {
e.printStackTrace();
log.error("Redis-Cluster Close失败 --- [{}]", e.getMessage());
}
}
}

  六、注入Bean

@Bean
public IJedisService redisSingleJedisService() { return new JedisSingleService(); } @Bean
IJedisService redisSentinelService() { return new JedisSentinelService(); } @Bean
IJedisService redisClusterService() { return new JedisClusterService(); }

  

Jedis整合单机、Sentinel和Cluster模式的更多相关文章

  1. SpringBoot连接Redis (Sentinel模式&Cluster模式)

    一.引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. 【Redis】Redis学习(二) master/slave、sentinel、Cluster简单总结

    项目中用到Redis,所以准备学习一下,感觉Redis的概念还是很多的,什么主从模式.sentinel模式.集群模式的,一下子都晕了,我觉得还是有必要先理清这些基本概念再说. 一.单节点实例 单节点实 ...

  3. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别

    转载自 https://blog.csdn.net/java_zyq/article/details/83818341 在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉 ...

  4. Spring Boot集成Redis集群(Cluster模式)

    目录 集成jedis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 集成spring-data-redis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 异常处理 同样的, ...

  5. Redis 5.0.7 讲解,单机、集群模式搭建

    Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...

  6. Redis集群-Cluster模式

    我理解的此模式与哨兵模式根本区别: 哨兵模式采用主从复制模式,主和从数据都是一致的.全量数据: Cluster模式采用数据分片存储,对每个 key 计算 CRC16 值,然后对 16384 取模,可以 ...

  7. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  8. benchmark pm2的cluster模式发布web app的性能与相关问题解决方法

    pm2以cluster集群方式发布app,可以高效地利用多核cpu,有效提升吞吐量.在上周对公司的redmine服务器进行性能调优后,深感ruby on rails的性能低下,这次测试nodejs的s ...

  9. Greenplum源码编译安装(单机及集群模式)完全攻略

    公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...

随机推荐

  1. Linux网卡驱动(4)—DM9000网卡驱动程序完全分析

    1.硬件连接 mini2440开发板上DM9000的电气连接和mach-mini2440.c文件的关系 其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x200000 ...

  2. 51nod-1204 并查集

    你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串(例如其中的第3到第5个数字)问他,该子串中包含了奇数个还是偶数个1,他会回答你的问题,然后你可以继续提问......你怀疑朋友的答案 ...

  3. Java学习之DOS基础

    Dos命令行dir:列出当前目录下的文件和文件夹md :创建目录rd :删除目录cd :进入指定目录cd..:退回到上一级目录cd/:退回到根目录del:删除文件exit:退出dos命令行 进入dos ...

  4. 注解@Override

    Android的开发者对@Override肯定是非常熟悉,不管是自己的代码中还是书上都会出现,但是他是什么意思呢?如下: @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: ...

  5. 什么是Web?

    Web这个词刚开始显得有些泛泛,似乎“冲浪”.“网上存在”以及“主页”等等都和它拉上了一些关系.甚至还有一种“Internet综合症”的说法,对许多人狂热的上网行为提出了质疑.我们在这里有必要作一些深 ...

  6. hdu 3486

    题意:n个人,每个人的价格a[  i  ] ,求最少分几组,每组取一个人,多出来的人就不考虑,使得这取出人的价格大于k.(每组人数一样) 分析:每组取一个人,那这个人肯定是这组最大的,枚举多少组就可以 ...

  7. VS系列远程调试

    其实很多时候,远程调试的话,我还是更喜欢用WinDBG的, 首先,可以练习WinDBG的使用手段, 其次,可以增加WinDBG的熟练度, 最重要的,WinDBG在内核调试部分很常用,我也很喜欢它,所以 ...

  8. Java中equals和hashcode的区别?

    Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...

  9. C语言结构体数组

    #include <stdio.h> int main() { /*************************************************** *结构体数组:数组 ...

  10. 初探Javascript魅力(1)

    转自:CSDN--http://blog.csdn.net/cherry_vicent/article/details/42120149 1.javascript是什么   根据用户的一些操作,然后来 ...