如何使用 Jedis 库建立与 Redis Sentinel 的连接? [关闭]

Posted

技术标签:

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

如何使用 Jedis 库设置与 Redis 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());

【讨论】:

除了 put 和 get 之外,我如何使用 Radisson 应用不同的 Redis 操作? @VeswanthRaju 这是Redis命令如何映射到Redisson对象github.com/redisson/redisson/wiki/11.-Redis-commands-mapping的文档

以上是关于如何使用 Jedis 库建立与 Redis Sentinel 的连接? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

4. Redis与Java的使用

Redis使用 Jedis 操作 Redis 数据库 ② ( Jedis API 规律 | Redis 命令与 Jedis 函数名称基本一致 | Jedis API 使用示例 )

Redis主从与哨兵架构详解 Redis主从架构 如何在同一台机器搭建主从架构 Redis主从工作原理 数据部分复制 Jedis使用 Redis的管道(Pipeline) Redis Lua脚本(代码

用jedis连接Redis集群

Redis入门——Jedis的基本使用

Redis实战-Jedis连接池的使用方法