Jedis和shardedjedis连接池
jedis连接池: 和数据库连接池很类似,为的就是减少不停的new对象,降低内存消耗。他有一个问题,就是一个redis client想要去使用redis server,就只能去这个redis server专用连接池里获取连接,这就意味着每一个redis server就需要一个连接池。
@Test
public void test02(){
//自定义属性 最大连接,最大空闲等
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
config.setMinIdle(2);
JedisPool pool=new JedisPool(config,"10.9.100.26",9000);
//通过连接池,获取连接资源
Jedis jedis = pool.getResource();
jedis.set("name","王老师");
System.out.println(jedis.get("name"));
//使用完资源,将资源还回连接池
pool.returnResource(jedis);
}
shardedjedis连接池: 和jedis连接池不一样的是,shardedjedis连接池他连接池里面放的是ShardedJedis对象,而我们知道再ShardedJedis对象中会传入一个list,其中保存的是redis server的信息,这个list中的redis server信息是哪里来的?就是从各个服务端的jedis连接池中来的。
@Test
public void test03(){
//收集分片信息
List<JedisShardInfo> info=new ArrayList<>();
info.add(new JedisShardInfo("10.9.100.26",6379));
info.add(new JedisShardInfo("10.9.100.26",6380));
info.add(new JedisShardInfo("10.9.100.26",6381));
//构造一个连接池属性配置
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(10);
config.setMinIdle(2);
//通过配置对象,和节点信息收集list创建一个分片连接池
ShardedJedisPool pool=new ShardedJedisPool(config,info);
ShardedJedis sJedis = pool.getResource();
sJedis.set("location","北京");
pool.returnResource(sJedis);
sJedis=pool.getResource();
System.out.println(sJedis.get("location"));
}
主从结构:
引入:
redis-server再进行数据处理的时候,把数据保存到内存中,但是如果该节点出现了问题,数据就会丢失,client请求就会失败,严重情况下可能会发生缓存击穿,缓存雪崩。所以就设计了主从结构。
解释:
把一个redis-server作为主节点,client还是正常访问它,然后可以把其他redis-server设为它的从节点,正常情况下这些从节点就是小弟,做着和主节点一样的工作,但是都是幕后的工作,直到主节点老大突然驾崩,然后从节点就上去顶替它,这样就可以做到数据不丢失,功能正常运行。
哨兵集群:
接着上面的思路,主节点失效,从节点顶替,那么这个过程是怎么实现的?这就用到了哨兵,哨兵会连接一个主节点,同时监听着其他主从节点,每秒钟哨兵会向主节点集群发送一个心跳访问,确保主节点还活着,如果主节点死了,那么所有哨兵就会开始投票,每个哨兵都会投出一票给自己心仪的从节点,最后票数最多的从节点就成为了主节点,当原来的主节点恢复后,就会被归为新主节点的从节点。
@Test
public void test04(){
//收集哨兵的连接信息,第一个参数是哨兵的ip地址,第二个参数是哨兵占用的端口号
Set<String> sentinelInfo =new HashSet<>();
sentinelInfo.add("10.9.100.26:26379");
sentinelInfo.add("10.9.100.26:26380");
sentinelInfo.add("10.9.100.26:26381");
//sentinelInfo.add(new HostAndPort("10.9.100.26",26379).toString())
//构建一个哨兵连接池
JedisSentinelPool pool=new JedisSentinelPool("mymaster",sentinelInfo);
//这是在pool记录的各种属性就会根据主从的变化而变化
System.out.println("当前正在使用的master信息:"+pool.getCurrentHostMaster());
//通过哨兵连接池来获取一个jdis对象,获取主节点连接对象
Jedis jedis = pool.getResource();//6384
jedis.set("name","王老师");
System.out.println(jedis.get("name"));
}
cluster:
你可能觉得哨兵已经很智能了,其实还有更智能的,那就是cluster。
结构:
如下图所示,它所有的主从节点都是两辆相连
特性:
- cluster中没有了哨兵进程,他把哨兵监听等功能,放入了主节点中。通过主节点来实现过半选举,监听整个集群功能。
- redis-cli进程客户端访问集群任何一个节点,都可以实现集群的分布式数据管理。因为集群内部引入了分布式的计算逻辑,可以将发送的数据进行计算之后帮助客户端重定向到正确节点来最终处理数据。
实现redis的分布式方法——hash槽
1.无论你通过哪个redis-server传递进来的key,首先计算出一个槽道号。
2.根据这个槽道号,找出管理这个槽道号的redis-server,然后新的redis-server会拿着这个key再计算槽道号,如果是它管理的就存入,否则接着找。