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.

12
demandé sur luksch 2015-11-21 13:02:16

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.

15
répondu luksch 2015-11-23 18:58:40

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));
9
répondu gschaden 2017-10-30 11:09:10

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;
        }
    }
3
répondu Onno Becker Hof 2016-12-10 11:30:19