(三)redis接続プールの詳細
3384 ワード
要約:原子性(atomicity):1つのトランザクションは分割できない最小作業単位であり、トランザクションに含まれるアクションはすべて行うか、しないかのいずれかです.Redisのすべての単一命令の実行は原子的であり,これはその単一スレッド機構に関係している.Redisコマンドの原子性により、同時性の問題を考慮することなく、原子性の自己増加操作INCRを利用して簡単なカウンタ機能を実現することができます.
一、まず異常を見てみましょう
異常なヒントから、redisクライアントは単一のモードであるため、サブスクリプションチャネルを発行した後、他の操作(P)SUBSCRIBE/(P)UNSUBSCRIBE/PING/QUITを除く)は許可されていないと判断できるだろう.
redis-cliクライアントはsubscribeモードに入ると、他のコマンドに応答できないことに注意してください.
二、Jedisインスタンスの取得方法をJedisPoolに変更する
三、購読チャンネルの取得
実行結果:
一、まず異常を見てみましょう
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context
at redis.clients.jedis.Protocol.processError(Protocol.java:127)
at redis.clients.jedis.Protocol.process(Protocol.java:161)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:285)
at redis.clients.jedis.JedisPubSub.process(JedisPubSub.java:121)
at redis.clients.jedis.JedisPubSub.proceed(JedisPubSub.java:115)
at redis.clients.jedis.Jedis.subscribe(Jedis.java:2680)
at redis.v1.client.RedisSubscribe.main(RedisSubscribe.java:23)
異常なヒントから、redisクライアントは単一のモードであるため、サブスクリプションチャネルを発行した後、他の操作(P)SUBSCRIBE/(P)UNSUBSCRIBE/PING/QUITを除く)は許可されていないと判断できるだろう.
redis-cliクライアントはsubscribeモードに入ると、他のコマンドに応答できないことに注意してください.
二、Jedisインスタンスの取得方法をJedisPoolに変更する
package redis.v1.client.server;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolClient {
private static JedisPool pool = null;
/**
*
* redis
*
* @return
*
* @author yaomy
* @date 2018 1 11 4:53:07
*/
static {
if(pool == null) {
JedisPoolConfig config = new JedisPoolConfig();
// pool jedis , pool.getResource() ;
// -1, ; pool maxActive jedis , pool exhausted( )。
config.setMaxTotal(500);
// pool idle( ) jedis 。
config.setMaxIdle(5);
// borrow( ) jedis , , , JedisConnectionException;
config.setMaxWaitMillis(1000*100);
// borrow jedis , validate ; true, jedis ;
config.setTestOnBorrow(true);
pool = new JedisPool(config, "127.0.0.1", 6379, 1000, "619868");
}
}
/**
*
* Jedis
*
* @return
*
* @author yaomy
* @date 2018 1 11 4:56:58
*/
public static Jedis getJedis() {
return pool.getResource();
}
}
三、購読チャンネルの取得
List list = JedisPoolClient.getJedis().pubsubChannels("*");
for(String channel:list) {
System.out.println("--- :"+channel);
}
実行結果:
:PONG
onSubscribe---redisChat---1
onSubscribe---redisChat1---2
onSubscribe---redisChat2---3
2
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1
4
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1
8
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1
16
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1
32
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1
64
---channels---3
--- :redisChat
--- :redisChat2
--- :redisChat1