簡體   English   中英

jedis 正確管理連接

[英]jedis correctly manage connections

我寫了一個 class ,其中我有連接池和流水線,使用這個 class 的方法類似於(我刪除了一個循環,但 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,我就會同步項目並清除管道並重新開始。 問題是如何通過此設置正確地將連接返回到池中。

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();
            }
        }

syncKeys()方法將是執行此操作的正確位置。 為了安全起見,您可能需要某種鎖定。 我以synchronized為例。

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

除了問題之外,您的應用程序是多線程的嗎? 如果沒有,那么您就在不必要地使用 JedisPool。 簡單的絕地武士就足夠了。 否則,您使用 Pool 錯誤。 比如你的Redis object在一定時間內最多限制使用一個絕地object。 這將是多線程場景中的瓶頸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM