上一篇中已经大致过了一下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 automaticallyjedisClusterNodes.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 examplejedis.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 automaticallyjedisClusterNodes.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也封装了相关实现。但是有了集群之后,谁还客户端分片啊??
@Testpublic 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");}@Testpublic 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);}
