[英]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.jedis
的BinaryJedisCluster
類復制到我們的應用程序中,並且您必須添加以下方法來公開連接處理程序。
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.