假定有2个 redis 服务实例(A和B)在运行,在客户端进行 set 操作:
set a0 xxx
set a1 xxx
set a2 xxx
set a3 xxx
我们希望a0, a1, a2, a3 分散保存在A和B中。
jedis 已经提供了这种功能:
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"> <constructor-arg index="0"> <bean class="redis.clients.jedis.JedisPoolConfig"></bean> </constructor-arg> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="192.168.233.8"/> <constructor-arg name="port" value="6381"/> </bean> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="192.168.233.8"/> <constructor-arg name="port" value="6379"/> </bean> </list> </constructor-arg> </bean>
测试代码:
ShardedJedisPool pool = ctx.getBean(ShardedJedisPool.class); StringBuilder sb = new StringBuilder(); sb.append('a'); for (int i = 0; i < 100; i++) { ShardedJedis jedis1 = pool.getResource(); if (i > 0) { sb.delete(1, sb.length()); } sb.append(i); System.out.println(sb.toString()); Thread.sleep(1000); jedis1.set(sb.toString(), "ifuck"); jedis1.close(); //记得关闭 }
这种思路是在客户端进行分片,但是如果分片服务器挂了呢?一致性哈希?
现有A和B两个redis服务实例。
如果B挂掉:
假定在xml文件中,JedisShardInfo list的配置顺序为A,B,当B挂掉后,我们需要创建另一个redis服务实例C,
然后把B的数据拷贝到C的目录下,然后启动C,再将JedisShardInfo list的配置改为A,C。
如果想把A B扩容成A B C:
这会造成部分数据的重新分片。