主页 > 知识库 > 在Redis集群中使用pipeline批量插入的实现方法

在Redis集群中使用pipeline批量插入的实现方法

热门标签:四川稳定外呼系统软件 高碑店市地图标注app b2b外呼系统 台湾电销 廊坊外呼系统在哪买 400电话办理的口碑 地图标注工厂入驻 南京手机外呼系统厂家 一个地图标注多少钱

由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下:

String key = "key";
Jedis jedis = new Jedis("xx.xx.xx.xx");
Pipeline p = jedis.pipelined();
ListString> myData = .... //要插入的数据列表
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集合代码就不写了

SetHostAndPort> nodes = .....

JedisCluster jedisCluster = new JedisCluster(nodes);



MapString, JedisPool> nodeMap = jedisCluster.getClusterNodes();

String anyHost = nodeMap.keySet().iterator().next();

//getSlotHostMap方法在下面有

TreeMapLong, String> slotHostMap = getSlotHostMap(anyHost); 

  private static TreeMapLong, String> getSlotHostMap(String anyHostAndPortStr) {
    TreeMapLong, String> tree = new TreeMapLong, String>();
    String parts[] = anyHostAndPortStr.split(":");
    HostAndPort anyHostAndPort = new HostAndPort(parts[0], Integer.parseInt(parts[1]));
    try{
      Jedis jedis = new Jedis(anyHostAndPort.getHost(), anyHostAndPort.getPort());
      ListObject> list = jedis.clusterSlots();
      for (Object object : list) {
        ListObject> list1 = (ListObject>) object;
        ListObject> master = (ListObject>) list1.get(2);
        String hostAndPort = new String((byte[]) master.get(0)) + ":" + master.get(1);
        tree.put((Long) list1.get(0), hostAndPort);
        tree.put((Long) list1.get(1), hostAndPort);
      }
      jedis.close();
    }catch(Exception e){
      
    }
    return tree;
  }

上面这几步可以在初始化的时候就完成. 不需要每次都调用, 把nodeMap和slotHostMap都定义为静态变量.

//获取槽号

int slot = JedisClusterCRC16.getSlot(key); 

//获取到对应的Jedis对象

Map.EntryLong, String> entry = slotHostMap.lowerEntry(Long.valueOf(slot));

Jedis jedis = nodeMap.get(entry.getValue()).getResource();

建议上面这步操作可以封装成一个静态方法, 比如命名为public static Jedis getJedisByKey(String key) 之类的. 意思就是在集群中, 通过key获取到这个key所对应的Jedis对象.

这样再通过上面的jedis.pipelined();来就可以进行批量插入了.

注:这个方法是从Google上搜来的, 直到目前我使用起来还没发现什么问题. 如果哪位大神发现有什么不对的地方欢迎提出来.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • Redis cluster集群的介绍
  • Spring-data-redis操作redis cluster的示例代码
  • Windows环境下Redis Cluster环境搭建(图文)
  • 如何用docker部署redis cluster的方法
  • python使用pipeline批量读写redis的方法
  • 详解Java使用Pipeline对Redis批量读写(hmset&hgetall)
  • 详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
  • redis cluster支持pipeline的实现思路

标签:定州 毕节 泰州 伊春 拉萨 甘南 南宁 河源

巨人网络通讯声明:本文标题《在Redis集群中使用pipeline批量插入的实现方法》,本文关键词  在,Redis,集群,中,使用,pipeline,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《在Redis集群中使用pipeline批量插入的实现方法》相关的同类信息!
  • 本页收集关于在Redis集群中使用pipeline批量插入的实现方法的相关信息资讯供网民参考!
  • 推荐文章