redis cluster使用pipeline
为什么cluster无法使用pipeline
主要是因为redis-cluster的hash分片。具体的redis命令,会根据key计算出一个槽位(slot),然后根据槽位去特定的节点redis上执行操作。那么pipeline中每个单独的操作,需要根据“key”运算一个槽位(JedisClusterCRC16.getSlot(key)),然后根据槽位去特定的机器执行命令。也就是说一次pipeline操作会使用多个节点的redis连接,而目前JedisCluster是无法支持的。
基于redisCluster整合pipeline
设计思路
-
首先创建RedisCluster客户端 --------------getCluster()
-
获取RedisCluster的哈希槽分布情况-----------------getSlotHostMap(params)
-
通过key计算出所属redis的节点,并获取redis客户端----------------------getJedisByKey(params)
-
通过redis客户端完成pipeline操作----------------main(args)
代码实现
import redis.clients.jedis.*;
import redis.clients.util.JedisClusterCRC16;
import java.util.*;
/**
* nifiDefined
* Created by NightWatch on 2018/12/10.
*/
public class PipelineTest {
public static void main(String[] args) throws InterruptedException, IOException {
String key ="key";
Jedis jedis = getJedisByKey(key);
Pipeline pipeline = jedis.pipelined();
pipeline.somecommend...
pipeline.sync();
pipelined.close();
jedis.close();
}
private static TreeMap<Long, String> getSlotHostMap(String anyHostAndPortStr) {
TreeMap<Long, String> tree = new TreeMap