上一篇中已经大致过了一下redis各种模式的部署方式,这次我们使用Jedis客户端进行连接。虽然实际开发中用不到,但是练习一下总没有坏处。
1.连接单实例Redis
Jedis的具体使用方式通过官方的github项目地址中的介绍,可以学习到一点。最基本的使用方式就是创建Jedis
实例,具体代码如下:
Jedis jedis = new Jedis("192.168.1.3",6379);
jedis.set("foo", "bar");
String value = jedis.get("foo");
当然这样是不好的,后面在Jedis的wiki上有连接池的使用方式。
2.连接集群
Jedis连接集群的方式也是在官方github的首页讲述了。具体代码如下:
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6379));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6381));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6382));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6383));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6384));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6380));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set("foo", "bar");
String value = jc.get("foo");
System.out.println(value);
3.连接池的使用
使用单个Jedis实例(如1所说)不是线程安全,但是在每个地方都new一个新的jedis实例,又会产生大量的Socket连接,于是连接池的产生就为了解决这一问题。Jedis的连接池是基于Apache Common Pool,所以需要引入。在jedis的wiki中写得很清楚,下面来看代码:
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMinIdle(10);
JedisPool pool = new JedisPool(jedisPoolConfig,"192.168.1.3",6378);
/// Jedis implements Closeable. Hence, the jedis instance will be auto-closed after the last statement.
try (Jedis jedis = pool.getResource()) {
/// ... do stuff here ... for example
jedis.set("foo1", "bar");
String foobar = jedis.get("foo1");
System.out.println(foobar);
}
/// ... when closing your application:
pool.close();
上面这段代码时对于单例的Redis而言的一种连接池写法。但是对于集群来讲,其写法又不一样:
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6379));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6381));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6382));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6383));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6384));
jedisClusterNodes.add(new HostAndPort("192.168.1.3", 6380));
//配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
JedisCluster jc = new JedisCluster(jedisClusterNodes,jedisPoolConfig);
jc.set("foo", "bar");
String value = jc.get("foo");
System.out.println(value);
集群的连接池是通过将池配置放入JedisCluster
对象中,这个是我百度搜出来的。
4.连接哨兵集群
哨兵模式的话,Jedis连接的应该是哨兵而不是具体的Redis主节点。因为主节点不可能告诉你他自己已经挂了。
HashSet<String> sentinels = new HashSet<>();
sentinels.add("192.168.1.3:26379");
sentinels.add("192.168.1.3:26380");
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinels,new JedisPoolConfig());
Jedis resource = jedisSentinelPool.getResource();
resource.set("foo","高溪");
String foo = resource.get("foo");
System.out.println(foo);
注意:sentinel的配置文件一定要写客户端可以访问到的ip地址,不要是环回地址。
5.客户端分片
如果你只有两个独立的Redis,为了分担数据压力,可以在客户端进行数据分片,Jedis也封装了相关实现。但是有了集群之后,谁还客户端分片啊??
@Test
public void testSharding(){
List<JedisShardInfo> list = new ArrayList<>();
JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.3", 6378);
JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.1.3", 6379);
list.add(jedisShardInfo);
list.add(jedisShardInfo1);
ShardedJedis shardedJedis = new ShardedJedis(list);
String set = shardedJedis.set("1", "23");
String set1 = shardedJedis.set("2", "23");
shardedJedis.set("aabd","33");
shardedJedis.set("34sfa","33");
shardedJedis.set("foo3","3242");
}
@Test
public void testShardingPool(){
List<JedisShardInfo> list = new ArrayList<>();
JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.1.3", 6378);
JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.1.3", 6379);
list.add(jedisShardInfo);
list.add(jedisShardInfo1);
GenericObjectPoolConfig config= new GenericObjectPoolConfig();
ShardedJedisPool shardedJedisPool = new ShardedJedisPool(config, list);
}