2017-09-20 4 views
0

Je souhaite récupérer plusieurs valeurs hashmap avec seulement des champs spécifiés. J'ai donc opté pour le pipeline Redis. Pendant le test du code ci-dessous, je vois redisResponse1 est toujours nulle, où redisResponse2 a une valeur.Redis Redis: Redis Pipeline toujours null

getRedisTemplate().executePipelined(new RedisCallback<Object>() { 
     @Override 
     public Object doInRedis(RedisConnection connection) throws DataAccessException { 
       List<byte[]> redisResponse1 = connection.hMGet(key.getBytes(), params); 
       List<byte[]> redisResponse2 = getRedisTemplate().getConnectionFactory().getConnection().hMGet(key.getBytes(), specificParams); 
       return null; 
     } 
    }); 

Quand je regarde dans le code et a constaté que ci-dessous, où

a) redisResponse2 n'est pas exécutée avec l'option pipeline

b) redisResponse1 est exécuté avec pipeline (isPipelined() == true) mais revenant toujours nul.

public List<byte[]> hMGet(byte[] key, byte[]... fields) { 
    try { 
     if (isPipelined()) { 
      pipeline(new JedisResult(pipeline.hmget(key, fields))); 
      return null; 
     } 
     if (isQueueing()) { 
      transaction(new JedisResult(transaction.hmget(key, fields))); 
      return null; 
     } 
     return jedis.hmget(key, fields); 
    } catch (Exception ex) { 
     throw convertJedisAccessException(ex); 
    } 
} 

Autant de questions sont

1) Comment puis-je obtenir mon cas d'utilisation avec l'option de pipeline?

2) Quel est l'impact d'accéder à getRedisTemplate().getConnectionFactory().getConnection() dans ce RedisCallback?

3) Comment ce concept de pipeline fonctionne-t-il? Est-ce que c'est comme Lua dynamique? où ce code Java est converti en script Lua et envoyé à Redis en tant que script, exécuté en Redis et revenir? Surpris dans ce rappel; le code accède/met également à jour les variables de classe externes, alors qu'adviendra-t-il de toutes ces variables? Toutes ces variables de classe externe envoient aussi à redis in lua?

4) Je vois beaucoup d'exemples sur doInRedis API retourne null; Pourquoi ça? Comment retourner/obtenir un objet valide à partir de cela?

+0

En utilisant spring-data-redis-1.6.6.RELEASE.jar –

Répondre

1

La majorité de vos questions sont disponibles dans la base de données Redis reference documentation.

Avant de creuser dans Pipelining, un seul multi-get d'un hachage ne nécessite pas de pipeline, car il ne s'agit que d'une seule commande. Pipelining n'améliorera pas la performance/stabilité/... de votre interaction avec Redis. Le traitement en pipeline est organisé comme un rappel et est destiné à émettre plusieurs commandes sans attendre le résultat immédiatement. Pensez-y comme un lot où vous obtiendrez tous les résultats plus tard. Étant donné que le traitement en pipeline synchronise les réponses à la toute fin, vous ne recevez pas les valeurs de résultat dans le rappel mais à la toute fin, lorsque la session de traitement en pipeline est synchronisée et que executePipelined(…) se termine.

Votre code devrait plutôt ressembler à:

List<Object> results = getRedisTemplate().executePipelined(new RedisCallback<Object>() { 

    @Override 
    public Object doInRedis(RedisConnection connection) { 

      connection.hMGet(key.getBytes(), params); 

      return null; 
    } 
}); 

List<Object> hmget = (List<Object>) results.get(0); 

Vous devez utiliser uniquement la connexion que vous recevez comme argument de rappel car la connexion est entré en mode pipelining. L'obtention d'une connexion depuis l'extérieur du rappel (comme template.getConnectionFactory().getConnection()) ouvrira une nouvelle connexion et exécutera des commandes Redis avec des réponses en attente - aucun pipeline n'est appliqué à une connexion externe obtenue.

Vous pouvez également utiliser les méthodes RedisTemplate au lieu de travailler avec la connexion simple. executePipelined(…) lie la connexion utilisée dans le rappel au thread actuel et réutilise cette connexion liée si vous appelez des méthodes d'API de modèle.

Concernant votre question Lua: Les appels de code/méthode ne sont pas transposés à Lua.

+0

plus1 Ok, Laissez-moi lire la documentation et revenir. –

+0

Oui, Cela a résolu mon problème. –