首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring data redis集群流水线支持

spring data redis集群流水线支持
EN

Stack Overflow用户
提问于 2017-02-28 03:32:53
回答 2查看 3.6K关注 0票数 2

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

EN

回答 2

Stack Overflow用户

发布于 2017-02-28 03:56:51

Spring Data Redis提供了几种用于在管道中执行命令的RedisTemplate方法。如果您不关心管道操作的结果,您可以使用标准的execute方法,为管道参数传递true。executePipelined方法将在管道中执行所提供的RedisCallback或SessionCallback,并返回结果。例如:

代码语言:javascript
复制
//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

票数 0
EN

Stack Overflow用户

发布于 2017-06-22 12:24:42

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

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

代码语言:javascript
复制
int slot = JedisClusterCRC16.getSlot(hKey);

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

代码语言:javascript
复制
JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();

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

代码语言:javascript
复制
public JedisSlotBasedConnectionHandler getConnectionHandler() {
   return (JedisSlotBasedConnectionHandler) this.connectionHandler;
}

最后,您可以通过调用getJedisConnectionFromSlot(slot)方法获得Jedis连接

代码语言:javascript
复制
JedisSlotBasedConnectionHandler jedisClusterConnectionHandler = jedisCluster.getConnectionHandler();
Jedis connection = jedisClusterConnectionHandler.getConnectionFromSlot(slot);
Pipeline pipeline = connection.pipelined();
pipeline.somecommand....
pipeline.sync();

Reference link

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42494234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档