(十一)Redis叢集JedisCluster實現keys命令方法
阿新 • • 發佈:2018-12-25
由於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; } }