如何使用 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 的连接? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Redis使用 Jedis 操作 Redis 数据库 ② ( Jedis API 规律 | Redis 命令与 Jedis 函数名称基本一致 | Jedis API 使用示例 )
Redis主从与哨兵架构详解 Redis主从架构 如何在同一台机器搭建主从架构 Redis主从工作原理 数据部分复制 Jedis使用 Redis的管道(Pipeline) Redis Lua脚本(代码