Redis集群事务控制工具

实现原理: redis集群对象JedisCluster不支持事务,但是,集群里面的每个节点支持事务。我们可以把这个key临时插入到集群中的某一个节点上,然后遍历集群的节点,获取临时key所在的那个节点,这样我们就可以开启这个节点的事务,最后删除临时key。

第一步:找到需要set的值插入到哪个节点上(比如set("姓名","张三"),找到"姓名"这个key所要插入的节点),并开启此节点事务。

public static Map<String, Transaction> multi(JedisCluster jedisCluster, String... keys)
  {
    Map<String, Transaction> txMap = new HashMap();
    if ((keys != null) && (keys.length > 0))
    {
      String[] arrayOfString;
      int j = (arrayOfString = keys).length;
      for (int i = 0; i < j; i++)
      {
        String key = arrayOfString[i];

//此时查看集群中是否有这个key的值
        boolean clusterExists = jedisCluster.exists(key).booleanValue();
        if (!clusterExists) {

//如果节点没有此值,那么用这个key作为临时key,插入
          jedisCluster.set(key, "");
        }

//获取集群所有的节点,遍历
        Map<String, JedisPool> mapNodes = jedisCluster.getClusterNodes();
        for (Map.Entry<String, JedisPool> node : mapNodes.entrySet())
        {
          JedisPool pool = (JedisPool)node.getValue();
          Jedis jedis = pool.getResource();
          try
          {

//查看临时key在哪个节点上
            if (jedis.exists(key).booleanValue())
            {
              if (!clusterExists) {

//删除此节点上的临时key
                jedisCluster.del(key);
              }

//把此节点保存并返回
              txMap.put(key, jedis.multi());
            }
          }
          catch (Exception localException) {}
        }
        if (!clusterExists) {
          jedisCluster.del(key);
        }
      }
    }
    return txMap;
  }

第二步:拿到key所在的节点,插入值,并预提交事务

 public static void set(Map<String, Transaction> txMap, Map<String, String> kvMap)
  {
    if (!kvMap.isEmpty()) {
      for (Map.Entry<String, String> entry : kvMap.entrySet())
      {
        String key = (String)entry.getKey();
        String value = (String)entry.getValue();
        
        Transaction tx = (Transaction)txMap.get(key);
        
        tx.set(key, value);
      }
    }
  }

第三步:提交事务并返回结果

 

  public static List<Object> exec(Map<String, Transaction> txMap)
  {
    List<Object> result = new ArrayList();
    if (!txMap.isEmpty()) {
      for (Map.Entry<String, Transaction> entry : txMap.entrySet()) {
        result.addAll(((Transaction)entry.getValue()).exec());
      }
    }
    return result;
  }

 

第四步:测试

public void Test{

public static void main(...){

Map<String,String> kvMapT = new HashMap<>();
        String key1T = "xingm";
        String key2T = "nianl";
        kvMapT.put(key1T, "zhangsan");
        kvMapT.put(key2T, "32");
        //开启事物
        Map<String, Transaction> txMapT = JedisClusterUtil.multi(jedisCluster, key1T,key2T);
        //添加数据  此处为预提交事务   
        JedisClusterUtil.set(txMapT, kvMapT);
        //提交事物  
        JedisClusterUtil.exec(txMapT);

   }

}

结尾:原理就是提前拿key去插入,计算出此key插入到哪个节点,然后开启对应节点的事务并提交。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Redis工具类是封装了Redis数据库操作的一组函数或方法,方便开发人员在Python中使用Redis进行数据存储、读取和修改等操作。它可以简化与Redis的交互流程,提高开发效率。 Python Redis工具类通常包含以下功能: 1. 连接Redis数据库:提供连接Redis数据库的方法,包括指定主机名、端口号和认证信息。 2. 数据保存和读取:提供将数据保存到Redis数据库和从数据库中读取数据的方法,支持多种数据类型(如字符串、哈希、列表、集合、有序集合等)。 3. 数据修改和删除:提供更新和删除数据的方法,可以更新单个键值对或批量操作。 4. 事务和管道支持:提供事务和管道操作的方法,可以提高多个Redis命令的执行效率。 5. 分布式锁支持:提供实现分布式锁的方法,用于并发控制和资源竞争场景。 6. 发布订阅功能:提供发布订阅功能的方法,支持在多个客户端之间发布和接收消息。 7. 集群支持:提供连接Redis集群的方法,支持在多个Redis节点之间进行数据分布和负载均衡。 通过使用Python Redis工具类,开发人员可以更方便地操作Redis数据库,无需手动处理与Redis的连接、事务管理和数据格式转换等细节。同时,Python Redis工具类还提供了一些高级功能,如分布式锁和发布订阅等,可以满足不同的业务需求。 总之,Python Redis工具类是一种简化Redis操作的工具,可以提高开发效率和代码可读性,使开发人员能够更好地利用Redis进行数据存储和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值