redis cluster使用pipeline

本文探讨了为何Redis Cluster不支持直接使用Pipeline的原因,主要在于命令根据key计算槽位并分散到不同节点执行。为解决此问题,文章提出了一个设计思路,包括创建RedisCluster客户端、获取槽位分布、按key获取对应节点的Redis客户端,以及如何通过这些客户端实现Pipeline操作。通过这些步骤,实现了在Redis Cluster中整合Pipeline的功能。
摘要由CSDN通过智能技术生成

为什么cluster无法使用pipeline

主要是因为redis-cluster的hash分片。具体的redis命令,会根据key计算出一个槽位(slot),然后根据槽位去特定的节点redis上执行操作。那么pipeline中每个单独的操作,需要根据“key”运算一个槽位(JedisClusterCRC16.getSlot(key)),然后根据槽位去特定的机器执行命令。也就是说一次pipeline操作会使用多个节点的redis连接,而目前JedisCluster是无法支持的。

基于redisCluster整合pipeline

设计思路

  1. 首先创建RedisCluster客户端 --------------getCluster()

  2. 获取RedisCluster的哈希槽分布情况-----------------getSlotHostMap(params)

  3. 通过key计算出所属redis的节点,并获取redis客户端----------------------getJedisByKey(params)

  4. 通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值