1.定义分片
1 | List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); |
2 | JedisShardInfo si = new JedisShardInfo( "localhost" , 6379 ); |
3 | si.setPassword( "foobared" ); |
5 | si = new JedisShardInfo( "localhost" , 6380 ); |
6 | si.setPassword( "foobared" ); |
有两种方式使用ShardedJedis.直接连接或者使用ShardedJedisPool.后者需要在多线程环境下使用。
2.a)直接连接:
1 | ShardedJedis jedis = new ShardedJedis(shards); |
2.b) 连接池:
01 | ShardedJedisPool pool = new ShardedJedisPool( new Config(), shards); |
02 | ShardedJedis jedis = pool.getResource(); |
05 | pool.returnResource(jedis); |
07 | ShardedJedis jedis2 = pool.getResource(); |
09 | pool.returnResource(jedis); |
3.Disconnect / returnRessource
在某一特定时刻完成使用Jedis尽快调用pool.returnResource。如果不这样做,连接池在一段时间后会变慢。getResource和returnResource的速度很快,没有连接了必须要创建。连接池的创建和销毁是比较慢的,因为这样连接实际上是网络连接。忘记pool.destroy保持连接始终打开直接过期.
确定某个键的片的信息
1 | ShardInfo si = jedis.getShardInfo(key); |
2 | si.getHost/getPort/getPassword/getTimeout/getName |
确定某些键去相同的片
实现这个目标需要的是"keytags"。使用keytags只需要在实例化ShardedJedis时设置一个模式。例如:
1 | ShardedJedis jedis = new ShardedJedis(shards, |
2 | ShardedJedis.DEFAULT_KEY_TAG_PATTERN); |
可以创建自己的模式。默认的模式是{},无论大括号里是什么将被用来确定分片。
例如:
1 | jedis.set( "foo{bar}" , "12345" ); |
3 | jedis.set( "car{bar}" , "877878" ); |
将去相同的片.
混合的方法
如果想更容易的加载分布的ShardedJedis,但是仍然需要事务/pipelining/发布订阅等,可以混合普通reids服务器和分片的redis服务器的方法:定义一个master作为普通的Jedis,其他的作为分片Jedis.使所有的分片redis服务器slaveof之前的master。"write"请求直接到master,"read"请求到ShardedJedis。"write"请求没有任何的扩展,但是"read"请求提高了很好的分布性,事务/pipelining/发布订阅等操作只用于master.数据集应该适合master的内存。如果让slaves做持久化的工作可以使master提高很多的性能。
监控
为了使用监控指令可以像下面这样做:
01 | new Thread( new Runnable() { |
03 | Jedis j = new Jedis( "localhost" ); |
04 | for ( int i = 0 ; i < 100 ; i++) { |
08 | } catch (InterruptedException e) { |
15 | jedis.monitor( new JedisMonitor() { |
16 | public void onCommand(String command) { |
17 | System.out.println(command); |