在Redis集群中使用pipeline批量插入的实现方法
由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下:
String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); ListmyData = .... //要插入的数据列表 for(String data: myData){ p.hset(key, data); } p.sync(); jedis.close();
但实际上遇到的问题是,项目上所用到的Redis是集群,初始化的时候使用的类是JedisCluster而不是Jedis. 去查了JedisCluster的文档, 并没有发现提供有像Jedis一样的获取Pipeline对象的 pipelined()方法.
Google了一下, 发现了解决方案.
Redis集群规范有说: Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个。每个主节点都负责处理 16384 个哈希槽的其中一部分。当我们说一个集群处于“稳定”(stable)状态时, 指的是集群没有在执行重配置(reconfiguration)操作, 每个哈希槽都只由一个节点进行处理。
所以我们可以根据要插入的key知道这个key所对应的槽的号码, 再通过这个槽的号码从集群中找到对应Jedis. 具体实现如下
//初始化得到了jedis cluster, 如何获取HostAndPort集合代码就不写了 Setnodes = ..... JedisCluster jedisCluster = new JedisCluster(nodes); Map nodeMap = jedisCluster.getClusterNodes(); String anyHost = nodeMap.keySet().iterator().next(); //getSlotHostMap方法在下面有 TreeMap slotHostMap = getSlotHostMap(anyHost);
private static TreeMapgetSlotHostMap(String anyHostAndPortStr) { TreeMap tree = new TreeMap (); String parts[] = anyHostAndPortStr.split(":"); HostAndPort anyHostAndPort = new HostAndPort(parts[0], Integer.parseInt(parts[1])); try{ Jedis jedis = new Jedis(anyHostAndPort.getHost(), anyHostAndPort.getPort()); List