您的位置:首页 > 数据库 > Redis

Java操作Redis实现单点故障自动切换

2015-03-31 11:36 507 查看
1、在项目中我们用redis,如果主节点宕机,这是正在操作redis的服务就会立即暂停,之前操作的数据可能出现异常。因此在Java客户端实现单点故障时很有必要的。

2、首先我们用到Jedis包中JedisSentinelPool监控连接池,我们通过连接redis监控集群来动态去解析redis集群主节点的信息,然后创建redis连接。

3、下面是连接redis集群代码

package com.test;

import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.exceptions.JedisConnectionException;
/**
* 连接redis监控实现单点故障自动切换测试类
* @author 张军
*/
public class RedisTest {

//监控连接池
private static JedisSentinelPool jedisPool = null;

//主节点的主机名
private static String master = "redis_master";

//主节点IP
public static String host = "192.168.1.111";

//端口号
public static int port = 26379;

//选择redis库(默认为0)
public static int database = 0;

//超时时间(0标识永远不超时)
public static int timeout = 0;

public static void main(String[] args) {
try {
Set<String> sentinels = new HashSet<String>();
sentinels.add(new HostAndPort(host,port).toString());
jedisPool = new JedisSentinelPool(master, sentinels,new JedisPoolConfig(),timeout,null,database);
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

/**
* 循环set数据,中间把主节点进程杀掉,看处理情况
* @throws InterruptedException
*/
public static void test() throws InterruptedException{
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
try {
Jedis jedis = jedisPool.getResource();
jedis.set("zhangjun_" + i, "" + i);
System.out.println("set第"+i+"条:"+i);
jedisPool.returnResource(jedis);
Thread.sleep(1000);
} catch (JedisConnectionException e) {
e.printStackTrace();
System.out.println("第"+i+"条出现异常:"+i);
Thread.sleep(1000);
}
}
long end = System.currentTimeMillis();
System.out.println("JedisSentinelPool@Pool SET: " + ((end - start)/1000.0) + " seconds");
}

}


持续补全中。。。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: