redis实现多进程数据同步工具代码分享_java

复制代码 代码如下:

package com.happyelements.odin.util;

import static com.google.common.base.Preconditions.checkNotNull;

import org.jetbrains.annotations.NotNull;

import com.happyelements.odin.jedis.JedisClient;
import com.happyelements.rdcenter.commons.util.DateTimeUtil;

/**
 * User: jude.wang
 * Date: 14-1-16
 * Time: 上午9:43
 */
public class ConcurrentUtil {

 public static final String USER_LOCK_KEY_FORMAT = "user_lock_%d_%s";
 public static final String CUSTOM_LOCK_FORMAT = "custom_lock_%s";
 public static final JedisClient redisClient = JedisClient.getInstance();
 public static final String UNLOCKED = "0";
 public static final String LOCKED = "1";
 private static final int MAX_REPEAT_TIMES = 10;

 @NotNull
 public static String buildUserLockKey(long userId, @NotNull String key) {
  checkNotNull(key);
  return String.format(USER_LOCK_KEY_FORMAT, userId, key);
 }

 @NotNull
 public static String buildCustomLockKey(@NotNull String key) {
  checkNotNull(key);
  return String.format(CUSTOM_LOCK_FORMAT, key);
 }

 /**
  * 此方法可以因为拿不到锁而导致operation没有执行
  *
  * @param key
  * @see com.happyelements.odin.util.ConcurrentUtil#buildCustomLockKey(String)
  * @see com.happyelements.odin.util.ConcurrentUtil#buildUserLockKey(long, String)
  *
  * @param operation
  * @throws com.happyelements.odin.util.ConcurrentUtil.OperationNotExecException
  *             operation没有被执行
  */
 public static void doJobWithLock(@NotNull String key, @NotNull ILockOperation operation) throws OperationNotExecException {

  boolean locked = false;
  try {
   checkNotNull(key);
   checkNotNull(operation);
   locked = lock(key);

  } catch (Throwable t) {
   throw new OperationNotExecException(key, t);
  }

  try {
   if (locked) {
    // System.out.println(Thread.currentThread() + "\t" + "lock");
    operation.doJob();
   } else {
    throw new OperationNotExecException(key);
   }
  } finally {
   if (locked) {
    unlock(key);
   }
  }
 }

 private static void unlock(String key) {
  try {
   checkNotNull(key);
   String oldStatus = redisClient.getSet(key, UNLOCKED);
   if (isUnlocked(oldStatus)) {
    // lock->doJob->过期->unlock
    // TODO LOG
   }
  } catch (Throwable t) {
   // TODO LOG
  }
  // System.out.println(Thread.currentThread() + "\t" + "unlock");
 }

 private static boolean isUnlocked(String status) {
  return status == null || status.equals(UNLOCKED);
 }

 private static boolean lock(String key) {

  boolean locked = false;

  for (int i = 0; i < MAX_REPEAT_TIMES; i++) {
   String oldStatus = redisClient.getSet(key, LOCKED);

   if (isUnlocked(oldStatus)) {
    if (oldStatus == null) {
     redisClient.expire(key, DateTimeUtil.MINUTE_SECOND * 5);
     locked = true;
     break;
    }
    locked = true;
    break;
   }
  }

  return locked;
 }

 public static interface ILockOperation {
  void doJob();
 }

 /**
  * {@link com.happyelements.odin.util.ConcurrentUtil.ILockOperation#doJob()}没有被执行
  * 上层必须处理该异常,捕获到该异常可以retry本次操作,或者包装成{@link com.happyelements.rdcenter.commons.throwable.HeException} 抛出去
  */
 public static class OperationNotExecException extends Exception {
  public OperationNotExecException() {
  }

  public OperationNotExecException(String s) {
   super(s);
  }

  public OperationNotExecException(String s, Throwable throwable) {
   super(s, throwable);
  }

  public OperationNotExecException(Throwable throwable) {
   super(throwable);
  }
 }
}

时间: 2024-10-03 01:21:24

redis实现多进程数据同步工具代码分享_java的相关文章

java制作复制文件工具代码分享_java

复制代码 代码如下: package com.robin; import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Properties; public class FileCopy { // priv

mysql 主从数据同步备份经验分享

mysql教程 主从数据同步备份经验分享 准备工作: 1.二台机器(我的是winxp ip 192.168.0.119从主服务器 win2003 192.168.0.17主服务器) 2.在两台机器分别装上mysql数据库教程服务器(注:最好是从服务器版本要高于主服务器版本) 3.为了方便记忆我把主服务器192.168.0.17称作111cn.net-a,从服务器192.168.0.119 111cn.net-b机器 首页我们配置主服务器,创建一个数据库 a111cnnet 创建表test 找到你

centos 6.0下安装rsync远程数据同步工具

Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的"Rsync算法"来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快. Rsync本来是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配置文件.Rsync可以通过rsh或ssh使用,也能以daemon模式去运行,

php制作unicode解码工具代码分享

 php制作Unicode编码解码在线转换工具代码分享 代码如下: <?php function unicode_encode($name) {     $name = iconv('UTF-8', 'UCS-2', $name);     $len = strlen($name);     $str = '';     for ($i = 0; $i < $len - 1; $i = $i + 2)     {         $c = $name[$i];         $c2 = $n

rsync一个Linux平台下的远程数据同步工具

rsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN快速同步多台主机之间的文件.也可以使用 rsync 同步本地硬盘中的不同目录.rsync 是用于替代 rcp 的一个工具,rsync 使用所谓的 rsync算法 进行数据同步,这种算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快. 您可以参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运作机制.rsync 的初始作者是 And

大数据同步工具DataX与Sqoop之比较

DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据http://www.aliyun.com/zixun/aggregation/34332.html">处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成.Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以

GoodSync文件数据同步工具使用教程

  GoodSync利用创新的同步算法,可以有效防止文件误删除,数据意外丢失,并消除重复的文件.GoodSync已经从用户和媒体获得许多衷心的赞扬和高度评价.本产品所具备的强大技术能力,使它表现出显著地操作易用性,同时也是目前唯一实现真正双向数据同步的解决方案. GoodSync如何方便地设置和使用,这些都需要你来亲身体验.接下来,我们的介绍将让你了解如何快速进行设置和自动同步数据. 基础设置 步骤 1: 点击两侧 浏览 按钮以选定需要同步的双方文件夹. 步骤 2: 点击 分析 按钮GoodSy

C#如何开发ETL数据同步工具,大数据同步如何解决

问题描述 现在公司要开发全面软件预算系统,要涉及大量的和其它系统的数据同步操作,原来一直用Kettle开源的ETL做数据同步但用起来不是很稳定,现想用C#开发一个桌面程序用来同步数据假如设想以下办法1.用Ado.net将来源服务器数据查到DataTable中再用SqlBulkCopy一次性导入到目标服务器中优点:只要DataTable能撑住就可以实现,但不知道稳不稳定缺点:数据存储量应该有限制这种应该是存在内存上的对吧100W条记录估计要来回查询N次2.用用Ado.net的DataReader一

大数据异构环境数据同步工具DataX 与Sqoop 之比较

从接触DataX起就有一个疑问,它和Sqoop到底有什么区别,昨天部署好了DataX和Sqoop,就可以对两者进行更深入的了解了. 两者从原理上看有点相似,都是解决异构环境的数据交换问题,都支持oracle,mysql,hdfs,hive的互相交换,对于不同数据库的支持都是插件式的,对于新增的数据源类型,只要新开发一个插件就好了, 但是只细看两者的架构图,很快就会发现明显的不同 DataX架构图 Job: 一道数据同步作业 Splitter: 作业切分模块,将一个大任务与分解成多个可以并发的小任