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

redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享

 更新時(shí)間:2014年01月19日 14:38:51   作者:  
這篇文章主要介紹了使用redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具的代碼,大家參考使用吧

復(fù)制代碼 代碼如下:

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

 /**
  * 此方法可以因?yàn)槟貌坏芥i而導(dǎo)致operation沒(méi)有執(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沒(méi)有被執(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->過(guò)期->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()}沒(méi)有被執(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);
  }
 }
}

相關(guān)文章

  • 詳解SpringBoot實(shí)現(xiàn)fastdfs防盜鏈功能的示例代碼

    詳解SpringBoot實(shí)現(xiàn)fastdfs防盜鏈功能的示例代碼

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

    Spring條件注解沒(méi)生效該如何解決

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

    圖解Java排序算法之堆排序

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

    Spring中的代理ProxyFactory解析

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

    Java全局異常處理器實(shí)現(xiàn)過(guò)程解析

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

    Java中日期的加減&String Date Calendar的相互轉(zhuǎn)換方式

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

    Java編程在方法中哪些時(shí)候需要參數(shù)

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

    maven查看依賴(lài)樹(shù)的方法實(shí)現(xiàn)

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

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

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

    CentOS 7下JDK8的詳細(xì)安裝步驟

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

最新評(píng)論

康乐县| 弥勒县| 新龙县| 环江| 潼关县| 曲沃县| 宁南县| 平和县| 沂源县| 平和县| 拜城县| 吴川市| 泾源县| 托里县| 柘荣县| 宁城县| 莆田市| 高邑县| 武隆县| 贡山| 鄱阳县| 察雅县| 黄山市| 衡东县| 岐山县| 金塔县| 永仁县| 肇州县| 天长市| 长海县| 宁安市| 偏关县| 肃南| 海南省| 新郑市| 渭南市| 山东省| 鲁甸县| 比如县| 黄骅市| 东城区|