一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - redis實現多進程數據同步工具代碼分享

redis實現多進程數據同步工具代碼分享

2019-11-03 17:35java教程網 JAVA教程

這篇文章主要介紹了使用redis實現多進程數據同步工具的代碼,大家參考使用吧

代碼如下:


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);
  }
 }
}

 

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品免费精品自在线观看 | 午夜AV国产欧美亚洲高清在线 | 亚洲国产成人在线视频 | 99精品国产自在现线观看 | 拍拍叫痛的无挡视频免费 | www四虎| 91免费永久在线地址 | 日韩不卡一区二区 | 免费在线观看视频 | 4455在线 | 欧美伊香蕉久久综合类网站 | 亚洲欧美日韩另类精品一区二区三区 | 国产精品3p视频 | 欧美性欲| 亚洲精品国产精品国自产观看 | 偷拍综合网 | 日韩精品视频美在线精品视频 | 插鸡视频在线观看 | 乳环贵妇堕落开发调教番号 | 日本久久影视 | 日本一卡=卡三卡免费 | 扒开双腿羞辱调教play视频 | 久久中文字幕亚洲 | 好大好硬好紧太深了受不了 | 99久久精品免费看国产一区二区 | 免费看一区二区三区 | 免费370理论片中文字幕 | 女主被男主做哭失禁高h | 我和么公的秘密小说免费 | 国产99视频精品免视看7 | 天天性综合 | www.男人的天堂.com | 韩国美女主播在线 | 亚洲欧美专区 | 亚洲欧美综合区自拍另类 | 久久久GOGO无码啪啪艺术 | 99热这里有免费国产精品 | 催眠 迷j系列小说 | 美女福利视频午夜在线 | 欧美日本一区视频免费 | 国产精品视频在线观看 |