移花宫资源网 Design By www.nbddc.com
由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下:
String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); List<String> 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集合代码就不写了 Set<HostAndPort> nodes = ..... JedisCluster jedisCluster = new JedisCluster(nodes); Map<String, JedisPool> nodeMap = jedisCluster.getClusterNodes(); String anyHost = nodeMap.keySet().iterator().next(); //getSlotHostMap方法在下面有 TreeMap<Long, String> slotHostMap = getSlotHostMap(anyHost);
private static TreeMap<Long, String> getSlotHostMap(String anyHostAndPortStr) { TreeMap<Long, String> tree = new TreeMap<Long, String>(); String parts[] = anyHostAndPortStr.split(":"); HostAndPort anyHostAndPort = new HostAndPort(parts[0], Integer.parseInt(parts[1])); try{ Jedis jedis = new Jedis(anyHostAndPort.getHost(), anyHostAndPort.getPort()); List<Object> list = jedis.clusterSlots(); for (Object object : list) { List<Object> list1 = (List<Object>) object; List<Object> master = (List<Object>) 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.Entry<Long, 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上搜来的, 直到目前我使用起来还没发现什么问题. 如果哪位大神发现有什么不对的地方欢迎提出来.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
移花宫资源网 Design By www.nbddc.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
移花宫资源网 Design By www.nbddc.com
暂无评论...
更新日志
2024年06月14日
2024年06月14日
- 陈百强《感恩有你》DSD+SBM版[WAV+CUE][560MB]
- 世界启元光秀强度怎么样 光秀属性面板解析
- 世界启元古希腊文明怎么样 古希腊文明选择推荐
- 世界启元法兰西文明怎么样 法兰西文明选择推荐
- 群星《极度深情3CD》[WAV分轨]
- 群星《极品HIFI·女声情烧30首HQCD》2CD[WAV]
- 闽南语发烧音乐至尊典藏-《迷醉的歌声·声声醉》[WAV】
- 悔悟了?IGN法国为《黑神话》争议言论正式致歉
- Xbox发布会汇总:战争机器、毁灭战士新作亮相!
- IGN法国无知发言开团《黑神话》:金箍棒不是棉签
- 群星.2002-欢庆迪斯尼100周年3CD【滚石】【WAV+CUE】
- DRY.1998-TWO【正东】【WAV+CUE】
- 马常胜.2012-油菜花开的季节【风潮】【WAV+CUE】
- 世界启元光秀命运羁绊怎么样 光秀命运羁绊介绍
- 世界启元不列颠文明怎么样 不列颠文明选择推荐