在Redis集群模式下使用pipeline进行批量操作

最近开始又接触到了Redis,之前在工作中使用Redis的时候,由于QPS不高,都是直接get/set搞定了。这次遇到的业务数据量比较大,更新也很频繁,Redis使用是集群模式,所以本文记录下捣鼓出来的如何在集群模式下使用pipeline进行批量操作的代码。为啥要捣鼓...因为网上找到的方法都不太靠谱

Redis集群是没法执行一些批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16384个slot,不同的key会划分到不同的slot,集群中的每个节点对应一批slot。jedis客户端并没有封装批量操作的命令。

但是在Redis集群中,每个redis节点都能单独对外提供服务。同时Jedis客户端提供了计算key的slot方法,已经slot和节点之间的映射关系,通过这两个数据,就可以计算出每个key所在的节点,然后对相同节点上的数据使用pipeline获取数据。

本人使用的redis版本是7.x,jedis客户端版本是4.3.1

如何判断key所属的节点:

首先判断key所属的slot,使用JedisClusterCRC16.getslot()方法,可以直接计算出key所属的slot。

接着就是计算slot属于哪个node了。这里的jedisCluster是创建好的集群连接,可以获取slot对应的Connection,这个Connection就是Redis单节点的连接。Connection内部会有一个变量叫privat ConnectionPool memberOf 变量记录这个连接属于哪个连接池(这里的连接池就是类似创建单节点的JedisPool)。用反射的方式去获取每个slot对应的ConnectionPool变量:

同时jedisCluster还提供了getClusterNodes()方法,对应的返回结果是Map<String,ConnectionPool> key是节点信息,value为单个节点的连接池信息。

这样,通过ConnectionPool引用的对比,就可以获取到 key -> slot -> node 这样的一串映射关系,从而也就知道了key 和 node之间的对应关系!

Redis集群执行pipeline:

知道了 key -> slot -> node 三者之间的对应关系之后,接下来的事情就很好办了。讲属于同一个node的key放到同一个List里面。然后通过jedisCluster.getClusterNodes().get(***node编号***).getResurce()方法获取单个redis节点连接池中的单个redis连接。用jedis类封装一下,就可以愉快的进行查询啦:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Redis集群中,由于集群将数据划分为不同的slot,并且每个节点负责一批slot,所以无法直接执行一些批量操作命令,如mget和pipeline等。这是因为jedis客户端没有封装这些批量操作的命令。\[1\] 然而,如果你需要在Redis集群进行批量操作,可以使用pipeline来实现。通过使用pipeline,你可以将多个命令一次性发送给Redis服务器,减少了网络通信的开销,提高了性能。\[2\] 要在Redis集群使用pipeline进行批量操作,你需要将redis-trib.rb文件复制到集群的根目录中。你可以进入到Redis的解压目录,找到src文件夹中的redis-trib.rb文件,然后将其复制到集群目录中。例如,可以使用以下命令将redis-trib.rb文件复制到/root/redis-cluster/目录中:cp redis-trib.rb /root/redis-cluster/。\[3\] 通过使用pipeline和正确配置Redis集群,你可以实现在集群模式进行批量操作的需求。 #### 引用[.reference_title] - *1* *2* [在Redis集群模式使用pipeline进行批量操作](https://blog.csdn.net/zc19921215/article/details/128824445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [搭建redis集群使用,以及批处理启动关闭。](https://blog.csdn.net/weixin_44893467/article/details/111151110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值