[英]How PoolingHttpClientConnectionManager manage connections?
[英]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.