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 ?
Réponses
Trop de publicités?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
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();