1. 程式人生 > 資料庫 >Redis高階操作:scan代替keys

Redis高階操作:scan代替keys

首先我們上程式碼

/**
	 *  根據match 查詢redis中中的所有key
	 * @param match input the argument "ONLINE_*"
	 * @param limit 每次查詢個數,不要太大
	 */
	public Set getKeySize(String match,int limit) {
		HashSet<String> keySet = Sets.newHashSet();

		Jedis jedis = jedisPool.getResource();
		ScanParams scanParams = new ScanParams().match(match).count(limit);  //指定規則

		boolean hasNext = true;
		String cursor = "0";	//第一次查詢的遊標
		while (hasNext) {
			ScanResult<String> scanResult = jedis.scan(cursor,scanParams);
			List<String> keyList = scanResult.getResult();//返回當前查詢的key
			keySet.addAll(keyList);

			cursor = scanResult.getStringCursor();
			if ("0".equals(cursor)) {
				hasNext = false;
			}
		}

		return keySet;
	}

解釋:

上面的程式碼我們使用了scan命令,那麼為什麼不用 keys命令呢?其實是keys是阻塞的當key太多時,就會對redis造成很大壓力

redis scan命令解釋

命令: scan cursor [MATCH pattern] [COUNT count] 

該命令其實是一個遊標查詢,跟elasticsearch的滾動查詢是一樣的

 MATCH : 模糊匹配 ,讓命令只返回和給定模式相匹配的元素 ,如:ORDER_*

COUNT :     每次的查詢條數,預設值為 10 ,(每次返回的數量其實不完全等於COUNT 值)

注意: 遊標返回的資料可能會重複,需要處理重複key