【问题标题】:How to setup a connection to Redis Sentinel using Jedis library? [closed]如何使用 Jedis 库建立与 Redis Sentinel 的连接? [关闭]
【发布时间】:2013-10-23 07:22:19
【问题描述】:

如何使用 Jedis 库设置与 Redis Sentinel 服务器/集群的连接?

【问题讨论】:

    标签: java redis jedis sentinel


    【解决方案1】:

    Jedis 库是一个很棒的解决方案,可惜文档很糟糕。

    所以,

    @Autowired private JedisSentinelPool pool;
    
    public void mymethod() {
        Jedis jedis = null;
        try {
            jedis = pool.getResource();
            jedis.hset(....
        } catch (JedisException je) {
            throw je;
        } finally {
            if (jedis != null) pool.returnResource(jedis);
        }
    }
    

    当我使用 Spring 时,我需要:

    <bean id="redisSentinel" class="redis.clients.jedis.JedisSentinelPool">
    <constructor-arg index="0" value="mymaster" />
    <constructor-arg index="1">
         <set>  
             <value>hostofsentinel:26379</value>  
        </set> 
    </constructor-arg>
    <constructor-arg index="2" ref="jedisPoolConfig"/>
    </bean>
    

    【讨论】:

    • RedisTemplate 怎么用这个?
    • 您可以使用 RedisTemplate 作为我为这篇文章分享的示例
    • 有人能解释一下为什么 JedisSentinelPool.getResource() 不返回 JedisSentinel 而是返回 Jedis 吗?
    • @Ray Wu,因为您不是在与哨兵交互,而是与哨兵为您跟踪的 redis master 交互。哨兵只是跟踪哪些大师可用,以便您与他们交谈。
    【解决方案2】:

    这是一个示例,当您不使用 Spring 并且需要通过 Jedis 与 Redis 哨兵管理的 Redis 主/从集进行简单连接时

    public class JedisTestSentinelEndpoint {
        private static final String MASTER_NAME = "mymaster";
        public static final String PASSWORD = "foobared";
        private static final Set sentinels;
        static {
            sentinels = new HashSet();
            sentinels.add("mymaster-0.servers.example.com:26379");
            sentinels.add("mymaster-1.servers.example.com:26379");
            sentinels.add("mymaster-2.servers.example.com:26379");
        }
    
        public JedisTestSentinelEndpoint() {
        }
    
        private void runTest() throws InterruptedException {
            JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels);
            Jedis jedis = null;
                try {
                    printer("Fetching connection from pool");
                    jedis = pool.getResource();
                    printer("Authenticating...");
                    jedis.auth(PASSWORD);
                    printer("auth complete...");
                    Socket socket = jedis.getClient().getSocket();
                    printer("Connected to " + socket.getRemoteSocketAddress());
                    printer("Writing...");
                    jedis.set("java-key-999", "java-value-999");
                    printer("Reading...");
                    jedis.get("java-key-999");
                } catch (JedisException e) {
                    printer("Connection error of some sort!");
                    printer(e.getMessage());
                    Thread.sleep(2 * 1000);
                } finally {
                    if (jedis != null) {
                        jedis.close();
                    }
                }
        }
    ...
    }
    

    来源:This blog post 关于连接到 Redis Sentinels。

    【讨论】:

      【解决方案3】:

      你试过Redisson吗?它提供哨兵自动主/从/哨兵发现和拓扑更新,您不需要处理连接、数据编码……这一切都由 Redisson 完成。下面是代码示例:

      Config config = new Config();
      config.useSentinelServers()
         .setMasterName("mymaster")
         .addSentinelAddress("127.0.0.1:26389", "127.0.0.1:26379")
      
      RedissonClient redisson = Redisson.create(config);
      
      RMap<MyKey, MyValue> map = redisson.getMap("myMap");
      map.put(new MyKey(), new MyValue());
      

      【讨论】:

      猜你喜欢
      • 2018-11-04
      • 2020-07-27
      • 1970-01-01
      • 2012-03-17
      • 2015-10-13
      • 2016-10-18
      • 2017-12-27
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多