簡體   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