使用连接池中的Jedis for PubSub

时间:2018-06-08 12:15:05

标签: redis jedis

正如Jedis documentation所述,Jedis客户端不是线程安全的。

  

单个Jedis实例不是线程安全的!

所以我使用的是JedisPool。我想从服务器将数据推送到浏览器的WebSocket客户端。为此我使用的是Redis的PubSub机制。

@ServerEndpoint(value = "/websocket/{channelName}", configurator = GetHttpSessionConfigurator.class)
public class WSEndpoint {

private WSJedisPubSub wsJedisPubSub;
private static JedisPool jedisPool = null;

@OnOpen
public void onOpen(Session session,
        @PathParam("channelName") String channelName) throws IOException,
        EncodeException {
    // FIXME proper synchronization is required here
    if (jedisPool == null) {
        initPool();
    }
    wsJedisPubSub = new WSJedisPubSub(session);
    try (Jedis redisClient = jedisPool.getResource()) {
        redisClient.subscribe(wsJedisPubSub, channelName);
    }

    private void initPool() {
        JedisPoolConfig jedisConfiguration = new JedisPoolConfig();
        jedisPool = new JedisPool(jedisConfiguration, "localhost", 6379);
    }
}

full code

我的应用程序可以连接数千个websockets。我怀疑跟随一段代码。

    try (Jedis redisClient = jedisPool.getResource()) {
        redisClient.subscribe(wsJedisPubSub, channelName);
    }
  1. 这个redisClient应该在try-with-resouce块之后关闭,但它仍在工作(获取订阅的事件)。怎么样?
  2. 默认情况下,池大小为8.我可以设置为n但最终我将有n + 1个Web套接字。处理这个问题的最佳方法是什么?我应该只有一个Jedis实例并自己进行消息路由吗?
  3. 如果Jedis客户端断开连接,那么重新连接的推荐方法是什么?

0 个答案:

没有答案