一,什么是redis集群:
1,Redis集群是一个实现分布式并且允许单点故障的Redis高级版本。
2,Redis集群没有最重要或者说中心节点,这个版本最主要的一个目标是
设计一个线性可伸缩(可随意增删节点?)的功能。
3,Redis集群为了数据的一致性可能牺牲部分允许单点故障的功能,
所以当网络故障和节点发生故障时这个系统会尽力去保证数据的一致性和有效性。
(这里我们认为节点故障是网络故障的一种特殊情况)
为了解决单点故障的问题,我们同时需要masters 和 slaves。
即使主节点(master)和从节点(slave)在功能上是一致的,
甚至说他们部署在同一台服务器上,从节点也仅用以替代故障的主节点。
实际上应该说 如果对从节点没有read-after-write(写并立即读取数据
以免在数据同步过程中无法获取数据)的需求,那么从节点仅接受只读操作。
二,简单模拟集群
1,改进redisproperties,在其中加入另外一台配有redis服务的机器即可。
注意:这里这两个redis其他都相同只是ip不同。
redis.pool.maxActive=1024
redis.pool.maxIdle=200
redis.pool.maxWait=1000
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
redis.ip=192.168.14.215
redis.port=6379
redis.ip2=192.168.14.137
2,使用ShardedJedisPool来创建池,在这之前用JedisShardInfo读取redis的配置,并存到一个List中。
后面跟使用池的方法一样。
具体代码:
import java.util.LinkedList;
import java.util.List;
import java.util.ResourceBundle;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class Test1 {
private static ShardedJedisPool pool;
static {
ResourceBundle bundle = ResourceBundle.getBundle("redis2");
if (bundle == null) {
throw new IllegalArgumentException("[redis.properties] is not found!");
}
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.valueOf(bundle.getString("redis.pool.maxActive")));
config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));
config.setMaxWaitMillis(Long.valueOf(bundle.getString("redis.pool.maxWait")));
config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));
config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));
JedisShardInfo jedisShardInfo1 = new JedisShardInfo(bundle.getString("redis.ip"),Integer.valueOf(bundle.getString("redis.port")));
JedisShardInfo jedisShardInfo2 = new JedisShardInfo(bundle.getString("redis.ip2"),Integer.valueOf(bundle.getString("redis.port")));
List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();
list.add(jedisShardInfo1);
list.add(jedisShardInfo2);
pool = new ShardedJedisPool(config, list);
//pool = new JedisPool(config, bundle.getString("redis.ip"), Integer.valueOf(bundle.getString("redis.port")));
}
public static void main(String[] args) {
// Jedis jedis=new Jedis("192.168.15.215");
//Jedis jedis = pool.getResource();
// 从池中获取一个Jedis对象
ShardedJedis jedis = pool.getResource();
String keys = "name";
jedis.del(keys);
jedis.set(keys, "yjl");
String value = jedis.get(keys);
System.out.println(value);
pool.returnBrokenResource(jedis);//释放连接池
}
}