当前位置: 首页 > 知识库问答 >
问题:

jedis正确管理连接

桂和同
2023-03-14

我写了一个类,其中有连接池和流水线,使用这个类的方法类似于(我删除了一个循环,但setKey将发生在循环中):

private Redis redis = new Redis();
redis.setKey(path, keyValueOutput, 3000);
redis.setKey(path, keyValueOutput, 3000);
redis.setKey(path, keyValueOutput, 3000);
if (redis.getPipelineCount() > 200) {
   redis.syncKeys();
   System.out.println("200 items added");
}

因此,一旦管道上的项目数超过200,i同步项目并清除管道,然后重新启动。问题是如何使用此设置将连接正确地返回到池。

public class Redis {
    private JedisPoolConfig poolConfig = new JedisPoolConfig();
    private JedisPool jedisPool = new JedisPool(poolConfig,"localhost", 6379);
    private Jedis jedis = jedisPool.getResource();
    
    private Pipeline pipeline = jedis.pipelined();
    private int pipelineCount = 0;

    public void setKey(String path, Map<String, String> keyValueOutput, int expireTime) {
        this.pipeline.hset(path, keyValueOutput);
        this.pipeline.expire(path, expireTime);
        this.pipelineCount = this.pipelineCount + 1;
    }

    public void syncKeys() {
        this.pipeline.sync();
        this.pipelineCount = 0;
    }

    public int getPipelineCount() {
        return this.pipelineCount;
    }

    public void close() {
        this.jedis.close();
    }

}

据我所知,我必须将jedispool.getResource()包装到try块中,但我无法考虑如何将它与管道和计数器结合在一起。

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Pipeline p = jedis.pipelined();
            p.sync()
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }

共有1个答案

步兴为
2023-03-14

synckeys()方法是执行此操作的正确位置。为了安全,你可能需要某种锁。我使用了synchronized作为示例。

    public synchronized void syncKeys() {
        this.pipeline.sync();
        this.jedis.close();
        this.jedis = null;
        this.pipelineCount = 0;
    }

除此之外,您的应用程序是多线程的吗?如果不是,那么您是在无谓地使用JedisPool。简单的绝地武士应该就够了。否则,你就用错了泳池。例如,您的Redis对象被限制在某个时间最多使用一个Jedis对象。这将是多线程场景中的一个瓶颈。

 类似资料:
  • 我有一个tomcat服务器并使用jedis客户端连接到它。 我使用的绝地版本是“3.0.0-m1”和tomcat 8.0.15 连接后,几个小时后,我看到以下例外情况。有什么帮助吗?

  • 创建一个连接 类org.jivesoftware.smack.XMPPConnection管理你的XMPP服务器的连接,默认实现类为org.jivesoftware.smack.XMPPTCPConnection。 主要是使用两个构造函数,第一个是 XMPPTCPConnection(String) ,它把 你想连接到服务器名称 作为参数。 连接和断开 // Create the configur

  • 我尝试配置Spring Security OAuth2。我必须配置身份验证管理器:客户端身份验证管理器和身份验证管理器。如果我正确理解了客户端身份验证管理器(clientAuthenticationManager)用于客户端授权(通过客户端id和客户端机密)和用户授权(通过用户登录和密码)对吗? 但是当我调试我的应用程序时,我看到当我发送请求时,自动化是由(不是)进行的。 我的配置:

  • 由于单个redis实例不符合我的要求,我选择了redis cluster。我用三个节点组成集群,并将数据填充到集群中。当我使用JedisCluster从集群获取数据时,它比单个实例花费更多的时间。那么,将绝地与redis星系团连接起来的正确方式是什么呢。我如何利用连接池将绝地与redis集群连接起来?

  • 我们在我们的项目中使用连接池。我们在我们的项目中看到,在连接关闭后,语句也会关闭。我知道在连接池的情况下,连接关闭后,到数据库的物理连接不会关闭,而是返回到池进行重用。所以我的问题是: 如果在连接关闭后关闭语句会发生什么?语句是否会正确关闭/关闭连接是否会关闭所有语句,关闭语句是多余的/语句是打开的,尽管连接返回到池中,但由于打开语句,它是不可重用的?(我们同时使用Statement和Prepar

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使