最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年01月19日 14:38:51   作者:  
這篇文章主要介紹了使用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沒有執(zhí)行
  *
  * @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沒有被執(zhí)行
  */
 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()}沒有被執(zhí)行
  * 上層必須處理該異常,捕獲到該異??梢詒etry本次操作,或者包裝成{@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);
  }
 }
}

相關文章

  • 詳解SpringBoot實現fastdfs防盜鏈功能的示例代碼

    詳解SpringBoot實現fastdfs防盜鏈功能的示例代碼

    我們可以通過fastdfs實現一個分布式文件系統(tǒng),如果fastdfs部署在外網,那么任何一個人知道了上傳接口,就可以實現文件的上傳和訪問。那么如何阻止他人訪問我們fastdfs服務器上的文件呢?此處就需要使用fastdfs的防盜鏈功能,本文就來講講如何實現這一功能
    2022-10-10
  • Spring條件注解沒生效該如何解決

    Spring條件注解沒生效該如何解決

    條件注解相信各位小伙伴都用過,Spring?中的多環(huán)境配置?profile?底層就是通過條件注解來實現的,下面小編就來為大家介紹一下當Spring條件注解沒生效時該如何解決,感興趣的可以了解下
    2023-09-09
  • 圖解Java排序算法之堆排序

    圖解Java排序算法之堆排序

    這篇文章主要為大家詳細介紹了Java經典排序算法之堆排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Spring中的代理ProxyFactory解析

    Spring中的代理ProxyFactory解析

    這篇文章主要介紹了Spring中的ProxyFactory解析,在Java中,代理模式的實現通常依靠Proxy類和InvocationHandler接口,本文將介紹如何使用ProxyFactory來創(chuàng)建代理模式,需要的朋友可以參考下
    2023-12-12
  • Java全局異常處理器實現過程解析

    Java全局異常處理器實現過程解析

    這篇文章主要介紹了Java全局異常處理器實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java中日期的加減&String Date Calendar的相互轉換方式

    Java中日期的加減&String Date Calendar的相互轉換方式

    這篇文章主要介紹了Java中日期的加減&String Date Calendar的相互轉換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Java編程在方法中哪些時候需要參數

    Java編程在方法中哪些時候需要參數

    這篇文章主要介紹了Java編程在方法中哪些時候需要參數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • maven查看依賴樹的方法實現

    maven查看依賴樹的方法實現

    Maven依賴樹是以當前項目的POM文件為根節(jié)點,列出了所有直接或間接依賴的依賴樹結構,本文就詳細的來介紹一下如何查看,感興趣的可以了解一下
    2023-08-08
  • Mybatis中and和循環(huán)or混用操作(or轉換成in)

    Mybatis中and和循環(huán)or混用操作(or轉換成in)

    這篇文章主要介紹了Mybatis中and和循環(huán)or混用操作(or轉換成in),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • CentOS 7下JDK8的詳細安裝步驟

    CentOS 7下JDK8的詳細安裝步驟

    這篇文章主要為大家介紹了CentOS 7下JDK8的詳細安裝步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

宁陵县| 屏南县| 永年县| 石棉县| 永城市| 靖江市| 梅州市| 新蔡县| 河北省| 巴彦县| 田林县| 宁晋县| 赣州市| 河东区| 云林县| 祁阳县| 黑河市| 茶陵县| 民和| 吴堡县| 隆安县| 香河县| 秦皇岛市| 兰溪市| 垣曲县| 岱山县| 苏州市| 吉木乃县| 崇义县| 包头市| 固镇县| 任丘市| 定南县| 贡嘎县| 莱阳市| 新竹县| 武定县| 鄯善县| 女性| 河西区| 扎囊县|