Redis:生産環境でkeyをどのように曖昧にクエリーしますか?

1633 ワード

一般的にテスト環境ではkeysコマンドを使用して、必要なkeyに曖昧にクエリーできますが、この操作はテスト環境でのみ使用するのに適しており、生産環境で使用するのに適していません.redisは単一スレッドで実行されているため、redisのデータ量が大きい場合、この操作はすべてのデータを遍歴し、結果を一度にすべて返し、実行時間が長くなり、後続の操作が待機します.システムの正常な動作に直接影響します.解決策はscanコマンドを使用することです.
scan cursor [MATCH pattern] [COUNT count]
  • cursor:カーソルを表し、「0」から始まると、このコマンドの実行後に新しいcursor値が返されます.cursor!「0」は、keyが返されていないことを示し、scanを呼び出し、この新しいcursor値を使用して次のkeyを取得する必要があります.cursor=「0」の場合、ループが終了します.
  • pattern:ファジイマッチングを表すスタイル
  • count:バッチが最大何個のレコードを返すかを示し、デフォルトは10
  • です.
    Javaコードの例を次に示します.
    import java.util.List;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.ScanParams;
    import redis.clients.jedis.ScanResult;
    
    public class RedisTester {
    
    	public static Jedis getRedis() {
    		Jedis jedis = new Jedis("127.0.0.1", 6379);
    		System.out.println("connect successfully");
    
    		jedis.auth("XXXXXXXXXX");
    
    		return jedis;
    	}
    
    	public static void main(String[] args) {
    		Jedis jedis = getRedis();
    		String cursor = "0";
    
    		do {
    			ScanParams scanParams = new ScanParams();
    			scanParams.match("activity560.user*");
    			scanParams.count(10);
    
    			ScanResult sr = jedis.scan(cursor, scanParams);
    			List resultList = sr.getResult();
    
    			for (String result : resultList) {
    				System.out.println("key: " + result);
    			}
    
    			cursor = sr.getStringCursor();
    			System.out.println("cursor: " + cursor);
    		} while (!cursor.equals("0"));
    	}
    
    }
    

     
    リファレンスドキュメント
    SCAN cursor[MATCH pattern][COUNT count][TYPE type]Redisコマンドリファレンス»Key(キー)]SCAN Redisのkeyを一括削除する方法