1. 程式人生 > >(十一)Redis叢集JedisCluster實現keys命令方法

(十一)Redis叢集JedisCluster實現keys命令方法

由於JedisCluster叢集類不支援像單機模式下的keys方法,下面的類我們就模擬keys命令方法:

一、獲取叢集類

package redis.v1.client.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.v1.client.common.RedisClusterOperator;
import utils.DateUtil;

public class JedisClusterClient {

	private static JedisCluster cluster = null;
	
	static {
		if(cluster == null) {
	        Set<HostAndPort> clusterNodes = new HashSet<HostAndPort>();
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7001));
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7002));
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7003));
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7004));
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7005));
	        clusterNodes.add(new HostAndPort("127.0.0.1", 7006));
	        
	        JedisPoolConfig config = new JedisPoolConfig();
	        //控制一個pool可分配多少個jedis例項,通過pool.getResource()來獲取;
            //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted(耗盡)。
			config.setMaxTotal(50);
			//控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項。
			config.setMaxIdle(5);
			//表示當borrow(引入)一個jedis例項時,最大的等待時間,如果超過等待時間,則直接丟擲JedisConnectionException;單位毫秒
			//小於零:阻塞不確定的時間,  預設-1
			config.setMaxWaitMillis(1000*100);
			//在borrow(引入)一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
			config.setTestOnBorrow(true);
			//return 一個jedis例項給pool時,是否檢查連線可用性(ping())
			config.setTestOnReturn(true);
			
			/**
			 * @param nodes 叢集伺服器地址
			 * @param connectionTimeout 連線超時 (毫秒)
			 * @param soTimeout 響應超時(毫秒)
			 * @param maxAttempts 出現異常最大重試次數
			 */
			cluster = new JedisCluster(clusterNodes, 2000, 2000, 10, config);
//			cluster = new JedisCluster(clusterNodes, 2000, 2000, 10, "619868", config);
		}
	}
	/**
	 * 
	 * 方法描述 獲取叢集物件
	 *
	 * @return
	 * 
	 * @author yaomy
	 * @date 2018年1月18日 上午11:17:05
	 */
	public static JedisCluster getRedisCluster() {
		return cluster;
	}
	
}

二、模擬keys命令方法類

package redis.v1.client.common;

import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.v1.client.server.JedisClusterClient;

public class RedisClusterOperator {

	/**
	 * 
	 *KEYS pattern
	 *查詢所有符合給定模式 pattern 的 key 。
	 *KEYS * 匹配資料庫中所有 key 。
	 *KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
	 *KEYS h*llo 匹配 hllo 和 heeeeello 等。
	 *KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
	 *特殊符號用 \ 隔開
	 * @param pattern
	 * @return
	 * 
	 * @author yaomy
	 * @date 2018年1月18日 上午11:20:02
	 */
	public static TreeSet<String> keys(String pattern) {
		TreeSet<String> keys = new TreeSet<String>();
		Map<String, JedisPool> clusterNodes = JedisClusterClient.getRedisCluster().getClusterNodes();
		for(Iterator<JedisPool> it=clusterNodes.values().iterator();it.hasNext();) {
			JedisPool pool = it.next();
			Jedis jedis = pool.getResource();
			try {
				keys.addAll(jedis.keys(pattern));
			} catch (Exception e) {
				System.out.println("獲取keys發生異常!");
			} finally {
				jedis.close();
			}
		}
		return keys;
	}
}