spring data redis集群管道支持

时间:2017-02-27 19:32:53

标签: spring redis cluster-computing

是否有计划在连接到redis群集版本时支持spring data redis库的“流水线”操作。流水线和流水线之间存在相当大的性能差异。非流水线操作。如果没有这样的计划,还有什么其他可行的选择?

2 个答案:

答案 0 :(得分:0)

Spring Data Redis提供了几种RedisTemplate方法,用于在管道中执行命令。如果您不关心流水线操作的结果,可以使用标准的execute方法,为pipeline参数传递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使用其值,散列键和散列值序列化程序在返回之前反序列化所有结果,因此上面示例中返回的项将是字符串。还有其他executePipelined方法,允许您为流水线结果传递自定义序列化程序。

请注意,RedisCallback返回的值必须为null,因为此值将被丢弃,以支持返回流水线命令的结果。

参考:http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline

答案 1 :(得分:0)

Spring数据redis不支持集群上的管道。所以我们可以在我们的应用程序中自己做。如果你使用spring-data-redis和Jedis库。

因此,我们必须间接从Jedis Pool获取Jedis Connection。现在,如果您只知道群集的密钥,那么首先需要找出与密钥相关联的槽。你可以通过以下方式获得它。

int slot = JedisClusterCRC16.getSlot(hKey);

其次,您可以通过以下方式获得JedisCluster连接

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

现在你有JedisCluster连接但是从Jedis池获取Jedis连接是不够的。因为JedisCluster没有直接暴露连接处理程序而JedisSlotConnectionHandler分类有从槽中返回jedis连接的方法。所以我们必须将BinaryJedisCluster类从包redis.clients.jedis复制到具有相同类和包名的应用程序中,并且必须添加以下方法来公开连接处理程序。

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

最后,您可以通过调用getJedisConnectionFromSlot(slot)方法

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

Reference link