Comment utiliser les commandes de SCAN dans Jedis
j'utilisais redis et jedis depuis un certain temps et n'a jamais eu besoin des commandes de SCAN jusqu'à présent. Maintenant cependant je dois utiliser le scanner les commandes, particulièrement hscan. Je comprends comment cela fonctionne au niveau du redis, mais le Jedis Java wrapper côté est déroutant pour moi. Il y a ScanResults
et ScanParameter
des cours qui circulent et je ne sais pas comment les utiliser correctement. La documentation pour cette fonctionnalité est inexistante ou au moins difficile à trouver. Quelqu'un peut-il indiquer où trouver des exemples décents de la façon d'itérer sur un hachage en utilisant hscan avec jedis?
désolé de ne pas avoir de code, mais ce que j'ai essayé jusqu'à présent n'a tout simplement aucun sens.
3 réponses
Dans la bonne tradition de répondre à des questions, voici ce que j'ai trouvé:
key = "THEKEY";
ScanParams scanParams = new ScanParams().count(100);
String cur = redis.clients.jedis.ScanParams.SCAN_POINTER_START;
boolean cycleIsFinished = false;
while(!cycleIsFinished){
ScanResult<Entry<String, String>> scanResult =
jedis.hscan(key, cur, scanParams);
List<Entry<String, String>> result = scanResult.getResult();
//do whatever with the key-value pairs in result
cur = scanResult.getStringCursor();
if (cur.equals("0")){
cycleIsFinished = true;
}
}
la partie importante est que cur est une variable de chaîne et il est "0"
si l'analyse est terminée.
je n'aime pas le drapeau des variables
Jedis jedis = new Jedis("localhost");
ScanParams scanParams = new ScanParams().count(10).match("*");
String cur = SCAN_POINTER_START;
do {
ScanResult<String> scanResult = jedis.scan(cur, scanParams);
// work with result
scanResult.getResult().stream().forEach(System.out::println);
cur = scanResult.getStringCursor();
} while (!cur.equals(SCAN_POINTER_START));
une suggestion à l'exemple ci-dessus. Vous pouvez spécifier la correspondance de clé dans la classe scanParams. Voir ci-dessous.
ScanParams scanParams = new ScanParams();
scanParams.match("*");
String cursor = redis.clients.jedis.ScanParams.SCAN_POINTER_START;
boolean cycleIsFinished = false;
while (!cycleIsFinished) {
ScanResult<String> scanResult = jedisRead.scan(cursor, scanParams);
List<String> result = scanResult.getResult();
/*
* do what you need to do with the result
*/
cursor = scanResult.getStringCursor();
if (cursor.equals("0")) {
cycleIsFinished = true;
}
}