2 votes

spring data redis cluster pipeline support

Est-il prévu de supporter les opérations "pipelinées" pour la bibliothèque spring data redis lors de la connexion à la version clusterisée de redis. Il y a des différences de performance considérables entre les opérations pipelinées et non pipelinées. S'il n'y a pas de tel plan, quelles sont les autres options viables ?

0voto

Spring Data Redis fournit plusieurs méthodes RedisTemplate pour exécuter des commandes dans un pipeline. Si vous ne vous souciez pas des résultats des opérations du pipeline, vous pouvez utiliser la méthode standard execute, en passant true pour l'argument pipeline. Les méthodes executePipelined exécutent la RedisCallback ou SessionCallback fournie dans un pipeline et renvoient les résultats. Par exemple, la méthode executePipelined

//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
  new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

L'exemple ci-dessus exécute une extraction en vrac d'éléments d'une file d'attente dans un pipeline. La liste des résultats contient tous les éléments extraits. RedisTemplate utilise ses sérialiseurs value, hash key et hash value pour désérialiser tous les résultats avant de les renvoyer, de sorte que les éléments renvoyés dans l'exemple ci-dessus seront des chaînes de caractères. Il existe d'autres méthodes executePipelined qui vous permettent de passer un sérialiseur personnalisé pour les résultats en pipeline.

Notez que la valeur renvoyée par la RedisCallback doit être nulle, car cette valeur est rejetée en faveur du renvoi des résultats des commandes en pipeline.

Référence : http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline

0voto

saurabhygk Points 15

Spring data redis ne supporte pas le pipeline sur le cluster. Nous devons donc le faire nous-mêmes dans notre application. Si vous utilisez spring-data-redis et la bibliothèque Jedis.

Pour cela, il faut donc prendre Jedis Connection indirectement à partir de Jedis Pool. Si vous ne connaissez que les clés du cluster, vous devez d'abord trouver le slot associé à la clé. Vous pouvez l'obtenir de la manière suivante.

int slot = JedisClusterCRC16.getSlot(hKey);

Deuxièmement, vous pouvez obtenir la connexion à JedisCluster de la manière suivante

JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();

Vous disposez maintenant d'une connexion JedisCluster, mais cela ne suffit pas pour obtenir une connexion Jedis à partir du pool Jedis. Parce que JedisCluster n'expose pas directement le gestionnaire de connexion et que JedisSlotConnectionHandler classing ayant une méthode qui renvoie la connexion jedis du slot. donc pour cela nous devons copier le fichier BinaryJedisCluster du paquet redis.clients.jedis dans notre application avec la même classe et le même nom de paquetage et vous devez ajouter la méthode suivante pour exposer le gestionnaire de connexion.

public JedisSlotBasedConnectionHandler getConnectionHandler() {
   return (JedisSlotBasedConnectionHandler) this.connectionHandler;
}

Enfin, vous pouvez obtenir Jedis Connection en appelant le numéro suivant getJedisConnectionFromSlot(slot) méthode

JedisSlotBasedConnectionHandler jedisClusterConnectionHandler = jedisCluster.getConnectionHandler();
Jedis connection = jedisClusterConnectionHandler.getConnectionFromSlot(slot);
Pipeline pipeline = connection.pipelined();
pipeline.somecommand....
pipeline.sync();

Lien de référence

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X