婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis實現分布式鎖和等待序列的方法示例

Redis實現分布式鎖和等待序列的方法示例

熱門標簽:地圖標注工廠入駐 一個地圖標注多少錢 四川穩定外呼系統軟件 臺灣電銷 高碑店市地圖標注app b2b外呼系統 廊坊外呼系統在哪買 400電話辦理的口碑 南京手機外呼系統廠家

在集群下,經常會因為同時處理發生資源爭搶和并發問題,但是我們都知道同步鎖 synchronized 、 cas 、 ReentrankLock 這些鎖的作用范圍都是 JVM ,說白了在集群下沒啥用。這時我們就需要能在多臺 JVM 之間決定執行順序的鎖了,現在分布式鎖主要有 redis 、 Zookeeper 實現的,還有數據庫的方式,不過性能太差,也就是需要一個第三方的監管。

背景

最近在做一個消費 Kafka 消息的時候發現,由于線上的消費者過多,經常會遇到,多個機器同時處理一個主鍵類型的數據的情況發生,如果最后是執行更新操作的話,也就是一個更新順序的問題,但是如果恰好都需要插入數據的時候,會出現主鍵重復的問題。這是生產上不被允許的(因為公司有異常監管的機制,扣分啥的),這是就需要個分布式鎖了,斟酌后用了 Redis 的實現方式(因為網上例子多)

分析

redis 實現的分布式鎖,實現原理是 set 方法,因為多個線程同時請求的時候,只有一個線程可以成功并返回結果,還可以設置有效期,來避免死鎖的發生,一切都是這么的完美,不過有個問題,在 set 的時候,會直接返回結果,成功或者失敗,不具有阻塞效果,需要我們自己對失敗的線程進程處理,有兩種方式

  • 丟棄
  • 等待重試 由于我們的系統需要這些數據,那么只能重新嘗試獲取。這里使用 redis 的 List 類型實現等待序列的作用

代碼

直接上代碼 其實直接redis的工具類就可以解決了

package com.test
import redis.clients.jedis.Jedis;

import java.util.Collections;
import java.util.List;

/**
 * @desc redis隊列實現方式
 * @anthor 
 * @date 
 **/
public class RedisUcUitl {

  private static final String LOCK_SUCCESS = "OK";
  private static final String SET_IF_NOT_EXIST = "NX";
  private static final String SET_WITH_EXPIRE_TIME = "PX";

  private static final Long RELEASE_SUCCESS = 1L;

  private RedisUcUitl() {

  }
  /**
   * logger
   **/

  /**
   * 存儲redis隊列順序存儲 在隊列首部存入
   *
   * @param key  字節類型
   * @param value 字節類型
   */
  public static Long lpush(Jedis jedis, final byte[] key, final byte[] value) {

    return jedis.lpush(key, value);
  
  }

  /**
   * 移除列表中最后一個元素 并將改元素添加入另一個列表中 ,當列表為空時 將阻塞連接 直到等待超時
   *
   * @param srckey
   * @param dstkey
   * @param timeout 0 表示永不超時
   * @return
   */
  public static byte[] brpoplpush(Jedis jedis,final byte[] srckey, final byte[] dstkey, final int timeout) {

    return jedis.brpoplpush(srckey, dstkey, timeout);

  }

  /**
   * 返回制定的key,起始位置的redis數據
   * @param redisKey
   * @param start
   * @param end -1 表示到最后
   * @return
   */
  public static Listbyte[]> lrange(Jedis jedis,final byte[] redisKey, final long start, final long end) {
    
    return jedis.lrange(redisKey, start, end);
  }

  /**
   * 刪除key
   * @param redisKey
   */
  public static void delete(Jedis jedis, final byte[] redisKey) {
    
     return jedis.del(redisKey);
  }

  /**
   * 嘗試加鎖
   * @param lockKey key名稱
   * @param requestId 身份標識
   * @param expireTime 過期時間
   * @return
   */
  public static boolean tryGetDistributedLock(Jedis jedis,final String lockKey, final String requestId, final int expireTime) {
    String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
    return LOCK_SUCCESS.equals(result);

  }

  /**
   * 釋放鎖
   * @param lockKey key名稱
   * @param requestId 身份標識
   * @return
   */
  public static boolean releaseDistributedLock(Jedis jedis,final String lockKey, final String requestId) {
    final String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

    return RELEASE_SUCCESS.equals(result);

  }
}

業務邏輯主要代碼如下

1.先消耗隊列中的

while(true){
  // 消費隊列
  try{
    // 被放入redis隊列的數據 序列化后的
    byte[] bytes = RedisUcUitl.brpoplpush(keyStr.getBytes(UTF_8), dstKeyStr.getBytes(UTF_8), 1);
    if(bytes == null || bytes.isEmpty()){
      // 隊列中沒數據時退出
      break;
    }
    // 反序列化對象
    MapString, Object> singleMap = (MapString, Object>) ObjectSerialUtil.bytesToObject(bytes);
    // 塞入唯一的值 防止被其他線程誤解鎖
    String requestId = UUID.randomUUID().toString();
    boolean lockGetFlag = RedisUcUitl.tryGetDistributedLock(keyStr,requestId, 100);
    if(lockGetFlag){
      // 成功獲取鎖 進行業務處理
      //TODO
      // 處理完畢釋放鎖 
      boolean freeLock = RedisUcUitl.releaseDistributedLock(keyStr, requestId);

    }else{
      // 未能獲得鎖放入等待隊列
     RedisUcUitl.lpush(keyStr.getBytes(UTF_8), ObjectSerialUtil.objectToBytes(param));
  
    }
    
  }catch(Exception e){
    break;
  }
  
}

2.處理最新接到的數據

同樣是走嘗試獲取鎖,獲取不到放入隊列的流程

一般序列化用 fastJson 之列的就可以了,這里用的是 JDK 自帶的,工具類如下

public class ObjectSerialUtil {

  private ObjectSerialUtil() {
//    工具類
  }

  /**
   * 將Object對象序列化為byte[]
   *
   * @param obj 對象
   * @return byte數組
   * @throws Exception
   */
  public static byte[] objectToBytes(Object obj) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(obj);
    byte[] bytes = bos.toByteArray();
    bos.close();
    oos.close();
    return bytes;
  }


  /**
   * 將bytes數組還原為對象
   *
   * @param bytes
   * @return
   * @throws Exception
   */
  public static Object bytesToObject(byte[] bytes) {
    try {
      ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
      ObjectInputStream ois = new ObjectInputStream(bin);
      return ois.readObject();
    } catch (Exception e) {
      throw new BaseException("反序列化出錯!", e);
    }
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Redis分布式鎖的正確實現方法總結
  • Redis分布式鎖的實現方式(redis面試題)
  • SpringBoot使用Redisson實現分布式鎖(秒殺系統)
  • SpringBoot集成Redisson實現分布式鎖的方法示例
  • Java Redis分布式鎖的正確實現方式詳解
  • redis分布式鎖的問題與解決方法
  • 淺談Redis分布式鎖的正確實現方式
  • 單機redis分布式鎖實現原理解析

標簽:畢節 南寧 伊春 泰州 河源 拉薩 定州 甘南

巨人網絡通訊聲明:本文標題《Redis實現分布式鎖和等待序列的方法示例》,本文關鍵詞  Redis,實現,分布式,鎖,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis實現分布式鎖和等待序列的方法示例》相關的同類信息!
  • 本頁收集關于Redis實現分布式鎖和等待序列的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲成人先锋电影| 亚洲欧美日韩久久| 国产精品亚洲一区二区三区在线| 国产精品久久久久久久久免费相片| 91麻豆免费视频| 国产成人精品午夜视频免费| 免费在线观看一区| 午夜精品一区二区三区免费视频| 最新日韩在线视频| 中文字幕在线一区| 中文字幕不卡在线观看| 久久久久综合网| 精品久久99ma| 5858s免费视频成人| 欧美片在线播放| 欧美日韩国产片| 欧美日韩在线一区二区| 欧美日韩三级一区二区| 7777精品伊人久久久大香线蕉的| 欧美群妇大交群中文字幕| 欧美日韩免费观看一区二区三区| 在线亚洲高清视频| 欧美丝袜自拍制服另类| 欧美人与性动xxxx| 欧美夫妻性生活| 91精品国产综合久久精品性色| 91精品在线观看入口| 日韩免费在线观看| 久久久九九九九| 亚洲欧洲性图库| 一区二区三区产品免费精品久久75| 亚洲一区二区影院| 理论片日本一区| 国模无码大尺度一区二区三区| 国产精品一区二区91| 99久久国产综合精品色伊| 99精品欧美一区二区三区综合在线| 92精品国产成人观看免费| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲第一会所有码转帖| 亚洲国产成人porn| 狠狠久久亚洲欧美| 91亚洲国产成人精品一区二区三 | 日欧美一区二区| 精品一区二区免费| 99久久久久免费精品国产| 欧美日韩高清影院| 久久久久国色av免费看影院| 国产精品美女久久久久久久久| 亚洲美女免费在线| 久久99精品国产麻豆婷婷洗澡| 成人免费视频播放| 欧美精品精品一区| 国产精品久久夜| 麻豆成人久久精品二区三区红| av电影在线观看完整版一区二区| 欧美日本韩国一区二区三区视频| 国产亚洲精久久久久久| 亚洲成人av中文| 91香蕉视频黄| 久久久久久久综合色一本| 亚洲图片欧美综合| 成人激情电影免费在线观看| 日韩女优av电影| 亚洲成人一区二区在线观看| 99久久国产综合色|国产精品| 日韩欧美电影在线| 一区二区欧美在线观看| 国产综合色视频| 欧美色图激情小说| 国产精品天干天干在观线| 国产综合色在线| 日韩精品中文字幕一区| 亚洲男人天堂av网| 成人av免费在线观看| 精品欧美黑人一区二区三区| 日韩**一区毛片| 欧美人妇做爰xxxⅹ性高电影 | 欧洲日韩一区二区三区| 亚洲精品在线观看网站| 一区二区不卡在线视频 午夜欧美不卡在 | 午夜精品福利一区二区蜜股av| 国产乱淫av一区二区三区 | 精品一区二区三区免费| 69堂精品视频| 首页国产欧美久久| 99精品黄色片免费大全| 国产精品久久久久久久久免费桃花| 国产激情视频一区二区三区欧美| 日韩免费视频线观看| 亚洲大片精品永久免费| 欧美人xxxx| 日韩高清不卡一区二区| 欧美一区二区大片| 美女网站一区二区| 精品三级在线观看| 狠狠色丁香婷婷综合久久片| ww亚洲ww在线观看国产| 国产真实乱子伦精品视频| 精品成a人在线观看| 国产精品亚洲综合一区在线观看| 久久久www成人免费毛片麻豆| 国产精品香蕉一区二区三区| 久久久综合视频| 国产99久久久国产精品潘金网站| 国产精品网站在线观看| 色哟哟在线观看一区二区三区| 亚洲一区影音先锋| 欧美一区二区三区白人| 国产在线精品免费av| 中国色在线观看另类| 在线一区二区三区四区五区| 天天av天天翘天天综合网 | 中文字幕高清一区| 91久久精品国产91性色tv | 国产宾馆实践打屁股91| 成人欧美一区二区三区黑人麻豆| 欧洲一区二区三区在线| 日产欧产美韩系列久久99| 久久免费电影网| 色视频成人在线观看免| 奇米影视7777精品一区二区| 久久蜜桃香蕉精品一区二区三区| 99久久精品免费看国产免费软件| 亚洲国产一区视频| 欧美一区二区三区视频免费| 国产成人精品一区二区三区四区| 一区二区三区产品免费精品久久75| 777a∨成人精品桃花网| 国产精品系列在线播放| 亚洲一区二区三区四区的| 久久亚洲精品小早川怜子| 91视频国产资源| 另类小说图片综合网| 亚洲欧美日本在线| 亚洲精品在线网站| 欧美色图免费看| aaa亚洲精品一二三区| 蜜臀av一区二区三区| 成人免费视频在线观看| 精品国产三级a在线观看| 色婷婷国产精品综合在线观看| 黑人精品欧美一区二区蜜桃| 亚洲成人午夜影院| 专区另类欧美日韩| 亚洲国产成人午夜在线一区| 欧美一区二区三区免费视频| 在线国产电影不卡| 99久久亚洲一区二区三区青草| 久久电影网站中文字幕| 亚洲va韩国va欧美va| 国产精品久久久久三级| 久久这里只有精品首页| 欧美一卡二卡三卡| 欧美日本一区二区三区四区| 91精彩视频在线观看| 99麻豆久久久国产精品免费 | 白白色 亚洲乱淫| 九九国产精品视频| 日一区二区三区| 亚洲午夜三级在线| 亚洲人123区| 国产精品二三区| 欧美国产欧美亚州国产日韩mv天天看完整 | 中文字幕一区二区日韩精品绯色| 精品少妇一区二区三区在线视频| 欧美色精品天天在线观看视频| 91麻豆福利精品推荐| 不卡视频一二三| 高清不卡一区二区| 成人蜜臀av电影| 成人av在线一区二区三区| 成人免费视频国产在线观看| 大尺度一区二区| 国产高清成人在线| 国产高清不卡二三区| 岛国精品一区二区| 99久久er热在这里只有精品66| 91在线视频观看| 色综合色综合色综合 | 六月丁香婷婷久久| 亚洲成人动漫av| 免费观看在线色综合| 韩国女主播成人在线| 国产一区二区三区综合| 国产激情视频一区二区在线观看| 国产精品一区二区视频| 成人综合在线观看| 日本久久一区二区三区| 欧美高清精品3d| 久久久亚洲国产美女国产盗摄 | 亚洲欧洲精品天堂一级| 亚洲乱码国产乱码精品精可以看| 亚洲一区二区av电影| 青青草原综合久久大伊人精品优势| 日本亚洲视频在线| 国产99久久久国产精品潘金网站| aa级大片欧美| 欧美一区二区三区免费大片| 欧美精品一区二区三区在线|