繁体   English   中英

Spring Data Redis集群管道支持

[英]spring data redis cluster pipeline support

连接到Redis集群版本时,是否有计划支持Spring数据Redis库的“流水线”操作。 流水线操作与非流水线操作之间存在相当大的性能差异。 如果没有这样的计划,还有哪些可行的选择?

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使用其值,哈希键和哈希值序列化器在返回之前对所有结果进行反序列化,因此,上面示例中返回的项目将为Strings。 还有其他的executePipelined方法,使您可以传递自定义序列化程序以获取管道化结果。

请注意,从RedisCallback返回的值必须为null,因为为了支持返回管线命令的结果而将其丢弃。

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

Spring Data 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连接的方法。 因此,我们必须使用相同的类和包名称将包redis.clients.jedisBinaryJedisCluster类复制到我们的应用程序中,并且您必须添加以下方法来公开连接处理程序。

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();

参考链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM