Redis
 sql >> Base de données >  >> NoSQL >> Redis

Spring Data Redis :Redis Pipeline renvoie toujours null

La majorité de vos questions sont disponibles dans la documentation de référence Spring Data Redis.

Avant de creuser dans Pipelining, un seul multi-get à partir d'un hachage ne nécessite pas de Pipelining car il ne s'agit que d'une seule commande. Le pipelining n'améliorera pas les performances/la stabilité/… de votre interaction Redis.

Le pipelining est organisé comme un rappel et destiné à émettre plusieurs commandes sans attendre le résultat immédiatement - considérez-le comme un lot où vous obtenez tous les résultats plus tard. Étant donné que le pipelining synchronise les réponses à la toute fin, vous ne recevez pas de valeurs de résultat dans le rappel mais à la toute fin, lorsque la session de pipelining est synchronisée et 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 passée en mode pipelining. Obtenir une connexion depuis l'extérieur du rappel (comme template.getConnectionFactory().getConnection() ) ouvrira une nouvelle connexion et exécutera les commandes Redis avec des réponses en attente - aucun pipeline n'est appliqué à une connexion externe obtenue.

Vous pouvez également utiliser les méthodes de RedisTemplate au lieu de travailler avec la connexion ordinaire. 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 en Lua.