• ShardedJedis的使用


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

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

  • 相关阅读:
    广播BroadcastReceiver(2)
    hunnu11544:小明的烦恼——找字符串
    Systemd启动图形界面过程
    大数据.......
    2014百度之星第一题Energy Conversion
    基于zookeeper简单实现分布式锁
    LeetCode OJ 215. Kth Largest Element in an Array 堆排序求解
    Leetcode
    Linux文件系统(七)---系统调用之open操作(一)
    Go语言Slice操作.
  • 原文地址:https://www.cnblogs.com/allenwas3/p/7826420.html
Copyright © 2020-2023  润新知