2017-06-15 7 views
0

私はLettuceの同期コマンドを使用してHSCANを実行しようとしています。問題は、MapScanCursorを初期化する正しい方法を理解できないことです。私はコンストラクタで成功しなかったし、MapScanCursor.INITIALScanCursorMapScanCursorのいずれかに運がないキャスト)型を返す。ここでレタスレディスクライアントライブラリでMapScanCursorをどのように初期化しますか?

は一例です:

RedisClient redisClient = RedisClient.create("redis://" + url + ":" + port); 
RedisHashCommands<String, String> redisCommands = redisClient.connect().sync(); 
List<String> fields = new LinkedList<>(); 

MapScanCursor<String, String> scanCursor = ? 

do { 
    scanCursor = redisCommands.hscan(key, scanCursor); 
    fields.addAll(scanCursor.getMap().keySet()); 
} while (!scanCursor.isFinished()); 

は、どのように私は "scanCursor" を初期化する必要がありますか?

は、あなたの質問に答えるだけでhscan(key)scanCursorを初期化するには:

答えて

0

2つのオプションがあります。

ScanIterator<KeyValue<String, String>> iterator = ScanIterator.hscan(redisCommands, key); 

while (iterator.hasNext()) { 

    KeyValue<String, String> next = iterator.next(); 
    // … 
} 

更新

do…whileベースを更新:

MapScanCursor<String, String> scanCursor = null; 

do { 
    if (scanCursor == null) { 
     scanCursor = redisCommands.hscan(key); 
    } else { 
     scanCursor = redisCommands.hscan(key, scanCursor); 
    } 
    fields.addAll(scanCursor.getMap().keySet()); 
} while (!scanCursor.isFinished()); 

また、あなたがScanIteratorを使用することができますIteratorで、RedisのSCAN利用状況の複雑さをカバー(レタス4.4を参照してください) tcfritchmanのコメントによるアプローチ。

+0

優れた代替案をお寄せいただきありがとうございます。これは私の問題を解決しました。ただし、最初のオプションを使用する場合は、もう一度 'hscan'を呼び出す前に'!scanCursor.isFinished() 'のチェックを行う必要があります。それ以外の場合は、最初の呼び出しでスキャンが終了するとエラーが発生します。例えば。 'scanCursor = redisCommands.hscan(key); while(!scanCursor.isFinished()){scanCursor = redisCommands.hscan(key、scanCursor); fields.addAll(scanCursor.getMap()。keySet()); } ' – tcfritchman

関連する問題