当连接到redis集群版本时,是否有计划支持spring data redis库的“流水线”操作?流水线操作和非流水线操作之间存在着相当大的性能差异。如果没有这样的计划,还有其他可行的选择吗?
发布于 2017-02-28 03:56:51
Spring Data Redis提供了几种用于在管道中执行命令的RedisTemplate方法。如果您不关心管道操作的结果,您可以使用标准的execute方法,为管道参数传递true。executePipelined方法将在管道中执行所提供的RedisCallback或SessionCallback,并返回结果。例如:
//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;
}
});上面的例子执行了从流水线中的队列中批量向右弹出项目。结果列表包含所有弹出的项目。在返回之前,RedisTemplate使用它的值、散列键和散列值序列化程序来反序列化所有结果,因此在上面的示例中返回的项将是String。还有一些额外的executePipelined方法,允许您为流水线结果传递自定义的序列化程序。
请注意,从RedisCallback返回的值必须为null,因为为了支持返回管道命令的结果,该值被丢弃。
参考:http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline
发布于 2017-06-22 12:24:42
Spring data redis不支持集群上的管道。所以我们可以在我们的应用程序中自己来做。如果你使用spring-data-redis和Jedis库。
因此,我们必须从Jedis Pool间接获取Jedis连接。现在,如果你只知道集群的键,那么首先你需要找出与键相关的槽。您可以通过以下方式获取。
int slot = JedisClusterCRC16.getSlot(hKey);其次,您可以通过以下方式获得JedisCluster连接
JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();现在您已经有了JedisCluster连接,但是从Jedis池获取Jedis连接是不够的。这是因为JedisCluster没有直接暴露连接处理程序,而JedisSlotConnectionHandler类有从插槽返回jedis连接的方法。因此,我们必须将redis.clients.jedis包中的BinaryJedisCluster类复制到具有相同类和包名的应用程序中,并且您必须添加以下方法来公开连接处理程序。
public JedisSlotBasedConnectionHandler getConnectionHandler() {
return (JedisSlotBasedConnectionHandler) this.connectionHandler;
}最后,您可以通过调用getJedisConnectionFromSlot(slot)方法获得Jedis连接
JedisSlotBasedConnectionHandler jedisClusterConnectionHandler = jedisCluster.getConnectionHandler();
Jedis connection = jedisClusterConnectionHandler.getConnectionFromSlot(slot);
Pipeline pipeline = connection.pipelined();
pipeline.somecommand....
pipeline.sync();Reference link
https://stackoverflow.com/questions/42494234
复制相似问题