假定有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:

这会造成部分数据的重新分片。

posted on 2017-11-13 15:06  偶尔发呆  阅读(1057)  评论(0编辑  收藏  举报