上一篇中已经大致过了一下redis各种模式的部署方式,这次我们使用Jedis客户端进行连接。虽然实际开发中用不到,但是练习一下总没有坏处。

1.连接单实例Redis

Jedis的具体使用方式通过官方的github项目地址中的介绍,可以学习到一点。最基本的使用方式就是创建Jedis实例,具体代码如下:

  1. Jedis jedis = new Jedis("192.168.1.3",6379);
  2. jedis.set("foo", "bar");
  3. String value = jedis.get("foo");

当然这样是不好的,后面在Jedis的wiki上有连接池的使用方式。

2.连接集群

Jedis连接集群的方式也是在官方github的首页讲述了。具体代码如下:

  1. Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
  2. //Jedis Cluster will attempt to discover cluster nodes automatically
  3. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6379));
  4. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6381));
  5. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6382));
  6. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6383));
  7. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6384));
  8. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6380));
  9. JedisCluster jc = new JedisCluster(jedisClusterNodes);
  10. jc.set("foo", "bar");
  11. String value = jc.get("foo");
  12. System.out.println(value);

3.连接池的使用

使用单个Jedis实例(如1所说)不是线程安全,但是在每个地方都new一个新的jedis实例,又会产生大量的Socket连接,于是连接池的产生就为了解决这一问题。Jedis的连接池是基于Apache Common Pool,所以需要引入。在jedis的wiki中写得很清楚,下面来看代码:

  1. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  2. jedisPoolConfig.setMaxTotal(10);
  3. jedisPoolConfig.setMaxIdle(10);
  4. jedisPoolConfig.setMinIdle(10);
  5. JedisPool pool = new JedisPool(jedisPoolConfig,"192.168.1.3",6378);
  6. /// Jedis implements Closeable. Hence, the jedis instance will be auto-closed after the last statement.
  7. try (Jedis jedis = pool.getResource()) {
  8. /// ... do stuff here ... for example
  9. jedis.set("foo1", "bar");
  10. String foobar = jedis.get("foo1");
  11. System.out.println(foobar);
  12. }
  13. /// ... when closing your application:
  14. pool.close();

上面这段代码时对于单例的Redis而言的一种连接池写法。但是对于集群来讲,其写法又不一样:

  1. Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
  2. //Jedis Cluster will attempt to discover cluster nodes automatically
  3. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6379));
  4. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6381));
  5. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6382));
  6. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6383));
  7. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6384));
  8. jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6380));
  9. //配置连接池
  10. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  11. JedisCluster jc = new JedisCluster(jedisClusterNodes,jedisPoolConfig);
  12. jc.set("foo", "bar");
  13. String value = jc.get("foo");
  14. System.out.println(value);

集群的连接池是通过将池配置放入JedisCluster对象中,这个是我百度搜出来的。

4.连接哨兵集群

哨兵模式的话,Jedis连接的应该是哨兵而不是具体的Redis主节点。因为主节点不可能告诉你他自己已经挂了。

  1. HashSet<String> sentinels = new HashSet<>();
  2. sentinels.add("192.168.1.3:26379");
  3. sentinels.add("192.168.1.3:26380");
  4. JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinels,new JedisPoolConfig());
  5. Jedis resource = jedisSentinelPool.getResource();
  6. resource.set("foo","高溪");
  7. String foo = resource.get("foo");
  8. System.out.println(foo);

注意:sentinel的配置文件一定要写客户端可以访问到的ip地址,不要是环回地址。

5.客户端分片

如果你只有两个独立的Redis,为了分担数据压力,可以在客户端进行数据分片,Jedis也封装了相关实现。但是有了集群之后,谁还客户端分片啊??

  1. @Test
  2. public void testSharding(){
  3. List<JedisShardInfo> list = new ArrayList<>();
  4. JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.3", 6378);
  5. JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.1.3", 6379);
  6. list.add(jedisShardInfo);
  7. list.add(jedisShardInfo1);
  8. ShardedJedis shardedJedis = new ShardedJedis(list);
  9. String set = shardedJedis.set("1", "23");
  10. String set1 = shardedJedis.set("2", "23");
  11. shardedJedis.set("aabd","33");
  12. shardedJedis.set("34sfa","33");
  13. shardedJedis.set("foo3","3242");
  14. }
  15. @Test
  16. public void testShardingPool(){
  17. List<JedisShardInfo> list = new ArrayList<>();
  18. JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.3", 6378);
  19. JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.1.3", 6379);
  20. list.add(jedisShardInfo);
  21. list.add(jedisShardInfo1);
  22. GenericObjectPoolConfig config= new GenericObjectPoolConfig();
  23. ShardedJedisPool shardedJedisPool = new ShardedJedisPool(config, list);
  24. }