(三)redis接続プールの詳細

3384 ワード

要約:原子性(atomicity):1つのトランザクションは分割できない最小作業単位であり、トランザクションに含まれるアクションはすべて行うか、しないかのいずれかです.Redisのすべての単一命令の実行は原子的であり,これはその単一スレッド機構に関係している.Redisコマンドの原子性により、同時性の問題を考慮することなく、原子性の自己増加操作INCRを利用して簡単なカウンタ機能を実現することができます.
一、まず異常を見てみましょう
 
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