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

主頁 > 知識庫 > 基于Redis分布式鎖的實現代碼

基于Redis分布式鎖的實現代碼

熱門標簽:西藏教育智能外呼系統價格 地圖標注費用 太原營銷外呼系統 竹間科技AI電銷機器人 最簡單的百度地圖標注 小紅書怎么地圖標注店 百度商家地圖標注怎么做 玄武湖地圖標注 地圖標注如何即時生效

概述

目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。分布式的CAP理論告訴我們“任何一個分布式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多只能同時滿足兩項。”所以,很多系統在設計之初就要對這三者做出取舍。在互聯網領域的絕大多數的場景中,都需要犧牲強一致性來換取系統的高可用性,系統往往只需要保證“最終一致性”,只要這個最終時間是在用戶可以接受的范圍內即可。

在很多場景中,我們為了保證數據的最終一致性,需要很多的技術方案來支持,比如分布式事務、分布式鎖等。

選用Redis實現分布式鎖原因

Redis有很高的性能

Redis命令對此支持較好,實現起來比較方便

在此就不介紹Redis的安裝了。

使用命令介紹

SETNX

SETNX key val
當且僅當key不存在時,set一個key為val的字符串,返回1;若key存在,則什么都不做,返回0。

expire

expire key timeout
為key設置一個超時時間,單位為second,超過這個時間鎖會自動釋放,避免死鎖。

delete

delete key
刪除key

在使用Redis實現分布式鎖的時候,主要就會使用到這三個命令。

實現

使用的是jedis來連接Redis。

實現思想

獲取鎖的時候,使用setnx加鎖,并使用expire命令為鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的value值為一個隨機生成的UUID,通過此在釋放鎖的時候進行判斷。

獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。

釋放鎖的時候,通過UUID判斷是不是該鎖,若是該鎖,則執行delete進行鎖釋放。
分布式鎖的核心代碼如下:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.exceptions.JedisException;
import java.util.List;
import java.util.UUID;
/**
 * Created by liuyang on 2017/4/20.
 */
public class DistributedLock {
 private final JedisPool jedisPool;
 public DistributedLock(JedisPool jedisPool) {
 this.jedisPool = jedisPool;
 }
 /**
 * 加鎖
 * @param locaName 鎖的key
 * @param acquireTimeout 獲取超時時間
 * @param timeout 鎖的超時時間
 * @return 鎖標識
 */
 public String lockWithTimeout(String locaName,
     long acquireTimeout, long timeout) {
 Jedis conn = null;
 String retIdentifier = null;
 try {
  // 獲取連接
  conn = jedisPool.getResource();
  // 隨機生成一個value
  String identifier = UUID.randomUUID().toString();
  // 鎖名,即key值
  String lockKey = "lock:" + locaName;
  // 超時時間,上鎖后超過此時間則自動釋放鎖
  int lockExpire = (int)(timeout / 1000);
  // 獲取鎖的超時時間,超過這個時間則放棄獲取鎖
  long end = System.currentTimeMillis() + acquireTimeout;
  while (System.currentTimeMillis()  end) {
  if (conn.setnx(lockKey, identifier) == 1) {
   conn.expire(lockKey, lockExpire);
   // 返回value值,用于釋放鎖時間確認
   retIdentifier = identifier;
   return retIdentifier;
  }
  // 返回-1代表key沒有設置超時時間,為key設置一個超時時間
  if (conn.ttl(lockKey) == -1) {
   conn.expire(lockKey, lockExpire);
  }
  try {
   Thread.sleep(10);
  } catch (InterruptedException e) {
   Thread.currentThread().interrupt();
  }
  }
 } catch (JedisException e) {
  e.printStackTrace();
 } finally {
  if (conn != null) {
  conn.close();
  }
 }
 return retIdentifier;
 }
 /**
 * 釋放鎖
 * @param lockName 鎖的key
 * @param identifier 釋放鎖的標識
 * @return
 */
 public boolean releaseLock(String lockName, String identifier) {
 Jedis conn = null;
 String lockKey = "lock:" + lockName;
 boolean retFlag = false;
 try {
  conn = jedisPool.getResource();
  while (true) {
  // 監視lock,準備開始事務
  conn.watch(lockKey);
  // 通過前面返回的value值判斷是不是該鎖,若是該鎖,則刪除,釋放鎖
  if (identifier.equals(conn.get(lockKey))) {
   Transaction transaction = conn.multi();
   transaction.del(lockKey);
   ListObject> results = transaction.exec();
   if (results == null) {
   continue;
   }
   retFlag = true;
  }
  conn.unwatch();
  break;
  }
 } catch (JedisException e) {
  e.printStackTrace();
 } finally {
  if (conn != null) {
  conn.close();
  }
 }
 return retFlag;
 }
}

測試

下面就用一個簡單的例子測試剛才實現的分布式鎖。
例子中使用50個線程模擬秒殺一個商品,使用--運算符來實現商品減少,從結果有序性就可以看出是否為加鎖狀態。

模擬秒殺服務,在其中配置了jedis線程池,在初始化的時候傳給分布式鎖,供其使用。

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Created by liuyang on 2017/4/20.
 */
public class Service {
 private static JedisPool pool = null;
 static {
 JedisPoolConfig config = new JedisPoolConfig();
 // 設置最大連接數
 config.setMaxTotal(200);
 // 設置最大空閑數
 config.setMaxIdle(8);
 // 設置最大等待時間
 config.setMaxWaitMillis(1000 * 100);
 // 在borrow一個jedis實例時,是否需要驗證,若為true,則所有jedis實例均是可用的
 config.setTestOnBorrow(true);
 pool = new JedisPool(config, "127.0.0.1", 6379, 3000);
 }
 DistributedLock lock = new DistributedLock(pool);
 int n = 500;
 public void seckill() {
 // 返回鎖的value值,供釋放鎖時候進行判斷
 String indentifier = lock.lockWithTimeout("resource", 5000, 1000);
 System.out.println(Thread.currentThread().getName() + "獲得了鎖");
 System.out.println(--n);
 lock.releaseLock("resource", indentifier);
 }
}
// 模擬線程進行秒殺服務

public class ThreadA extends Thread {
 private Service service;
 public ThreadA(Service service) {
 this.service = service;
 }
 @Override
 public void run() {
 service.seckill();
 }
}

public class Test {
 public static void main(String[] args) {
 Service service = new Service();
 for (int i = 0; i  50; i++) {
  ThreadA threadA = new ThreadA(service);
  threadA.start();
 }
 }
}

結果如下,結果為有序的。

若注釋掉使用鎖的部分

public void seckill() {
 // 返回鎖的value值,供釋放鎖時候進行判斷
 //String indentifier = lock.lockWithTimeout("resource", 5000, 1000);
 System.out.println(Thread.currentThread().getName() + "獲得了鎖");
 System.out.println(--n);
 //lock.releaseLock("resource", indentifier);
}

從結果可以看出,有一些是異步進行的。

在分布式環境中,對資源進行上鎖有時候是很重要的,比如搶購某一資源,這時候使用分布式鎖就可以很好地控制資源。
當然,在具體使用中,還需要考慮很多因素,比如超時時間的選取,獲取鎖時間的選取對并發量都有很大的影響,上述實現的分布式鎖也只是一種簡單的實現,主要是一種思想。

下一次我會使用zookeeper實現分布式鎖,使用zookeeper的可靠性是要大于使用redis實現的分布式鎖的,但是相比而言,redis的性能更好。

上面的代碼可以在我的GitHub中進行查看。

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

您可能感興趣的文章:
  • redis中使用java腳本實現分布式鎖
  • 基于Redis實現分布式鎖以及任務隊列
  • 詳解Java如何實現基于Redis的分布式鎖
  • Redis實現分布式鎖的幾種方法總結
  • Redis上實現分布式鎖以提高性能的方案研究
  • 詳解使用Redis SETNX 命令實現分布式鎖
  • Redis數據庫中實現分布式鎖的方法
  • Redis構建分布式鎖
  • redisson實現分布式鎖原理
  • 深入理解redis分布式鎖和消息隊列

標簽:林芝 贛州 唐山 澳門 揚州 廣東 景德鎮 香港

巨人網絡通訊聲明:本文標題《基于Redis分布式鎖的實現代碼》,本文關鍵詞  基于,Redis,分布式,鎖,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于Redis分布式鎖的實現代碼》相關的同類信息!
  • 本頁收集關于基于Redis分布式鎖的實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    波多野结衣的一区二区三区| 美腿丝袜亚洲三区| 欧美极品另类videosde| 在线电影国产精品| 国产一区二区久久| 日韩国产在线一| 1024国产精品| 久久美女艺术照精彩视频福利播放| 国产精品国产三级国产三级人妇| 欧美久久一二区| 一区二区日韩av| 粉嫩av亚洲一区二区图片| 国产精品另类一区| 久久女同精品一区二区| 国产一区二区三区在线观看免费| 国产真实乱偷精品视频免| 日韩欧美一级特黄在线播放| 亚洲欧美成aⅴ人在线观看| 成人激情午夜影院| 国产香蕉久久精品综合网| 972aa.com艺术欧美| 亚洲欧洲精品天堂一级| 91亚洲精华国产精华精华液| 亚洲欧美激情在线| 欧美在线看片a免费观看| 美腿丝袜亚洲一区| 日韩你懂的在线观看| 成人爱爱电影网址| 亚洲综合色视频| 久久综合久久综合亚洲| 色婷婷综合久久久中文一区二区| 一区二区三区四区在线| 精品日韩在线观看| 欧美视频第二页| 国产一区二区三区不卡在线观看 | 国产一区二区三区国产| √…a在线天堂一区| 欧美一激情一区二区三区| 国产精品一区二区三区四区| 中文字幕亚洲在| 久久99最新地址| 欧美性一二三区| 亚洲123区在线观看| 成人激情校园春色| 日韩欧美专区在线| 日韩中文字幕区一区有砖一区| 日本在线不卡视频一二三区| 中文字幕一区二区在线播放| 不卡av在线免费观看| 亚洲成av人片在线| 国产黄色成人av| 成人av小说网| 国产欧美一区二区在线观看| 亚洲国产视频在线| 91香蕉视频黄| 国产精品18久久久久久久网站| 欧美男男青年gay1069videost| 日韩欧美精品在线视频| 国产91在线观看丝袜| 日韩美女在线视频| 日韩免费性生活视频播放| 亚洲激情图片一区| 久久青草欧美一区二区三区| 99久久精品免费看国产| 国产精品美女久久久久av爽李琼 | 国产美女主播视频一区| 91网上在线视频| 亚洲一区二区在线视频| 欧美日本免费一区二区三区| 99re视频这里只有精品| 久久9热精品视频| 亚洲精品伦理在线| 久久91精品久久久久久秒播| 欧美激情一区二区三区蜜桃视频| 欧美激情一区三区| 亚洲精品在线观看网站| 欧美电影影音先锋| 91在线小视频| 成人av网站大全| 亚洲最大成人综合| 国产精品视频在线看| 色悠悠亚洲一区二区| 日韩一区精品字幕| 亚洲成av人片在线观看| 国产精品第五页| 国产精品看片你懂得| 国产精品久久久久久亚洲毛片| 成人少妇影院yyyy| 91蝌蚪国产九色| 成人蜜臀av电影| 国产主播一区二区| 国产一区不卡视频| 日韩va欧美va亚洲va久久| 亚洲青青青在线视频| 欧美欧美欧美欧美| 69久久夜色精品国产69蝌蚪网| 5566中文字幕一区二区电影| 欧美日韩大陆在线| 欧洲视频一区二区| 色狠狠桃花综合| 欧美精品99久久久**| 精品少妇一区二区三区| 国产精品毛片高清在线完整版| 91麻豆精品国产91久久久| 欧美成人一区二区三区在线观看| 久久老女人爱爱| 亚洲国产日产av| 国产一区二区在线观看视频| 色av综合在线| 久久亚洲一区二区三区四区| 亚洲天堂精品视频| 国产曰批免费观看久久久| 欧美性猛交xxxx黑人交| 久久久久久久av麻豆果冻| 亚洲制服丝袜在线| 国产成人精品免费| 7777精品伊人久久久大香线蕉的 | 91欧美一区二区| 欧美一区二区三区四区久久| 国产精品九色蝌蚪自拍| 久久精品久久精品| 欧美日本一区二区| 自拍偷自拍亚洲精品播放| 麻豆精品一区二区av白丝在线| 色综合久久中文综合久久97| 久久久精品2019中文字幕之3| 香蕉乱码成人久久天堂爱免费| 成人午夜激情在线| 精品国产一区二区三区忘忧草| 一区二区三区不卡在线观看| 丝袜美腿亚洲综合| 91国内精品野花午夜精品| 最近中文字幕一区二区三区| 久久成人18免费观看| 欧美日韩日本视频| 夜夜爽夜夜爽精品视频| 95精品视频在线| 久久久99精品免费观看| 亚洲欧美一区二区不卡| 国产精品―色哟哟| 亚洲成人综合网站| 亚洲视频一二区| 国产精品一区二区在线观看不卡| 在线91免费看| 亚洲一二三四久久| 在线观看欧美精品| 亚洲国产视频在线| 在线电影国产精品| 麻豆国产欧美一区二区三区| 日韩三级中文字幕| 国产在线精品视频| 国产精品丝袜在线| 欧美影院午夜播放| 日本不卡中文字幕| 久久久久久麻豆| 91麻豆精品视频| 午夜国产不卡在线观看视频| 制服丝袜一区二区三区| 精品亚洲免费视频| 国产欧美一二三区| 色综合久久综合网| 蜜臀a∨国产成人精品| 久久中文娱乐网| 日本韩国视频一区二区| 肉丝袜脚交视频一区二区| 欧美大片在线观看一区| 国产成人免费视频精品含羞草妖精| 亚洲国产精品成人综合色在线婷婷| 99视频有精品| 奇米在线7777在线精品| 国产精品久久毛片av大全日韩| 色婷婷一区二区| 久久国产视频网| 综合电影一区二区三区 | 亚洲精品videosex极品| 欧美性xxxxx极品少妇| 国内精品伊人久久久久av一坑| 亚洲欧美日韩久久| 久久综合九色综合欧美就去吻| 色狠狠桃花综合| 精品无人区卡一卡二卡三乱码免费卡| 中文字幕在线不卡一区二区三区| 欧美区视频在线观看| av电影天堂一区二区在线| 激情欧美日韩一区二区| 亚洲国产欧美日韩另类综合| 欧美国产精品劲爆| 精品国产乱码久久久久久老虎| 一本在线高清不卡dvd| 国产在线播精品第三| 日韩电影在线免费观看| 亚洲麻豆国产自偷在线| 国产精品视频九色porn| 精品国产精品网麻豆系列| 欧美午夜精品一区| 99国产精品久久久久久久久久| 国产精品一区二区视频| 蜜桃视频在线观看一区二区| 一区二区三区在线观看国产| 综合av第一页|