婷婷综合国产,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
    日韩免费观看高清完整版| 免费观看日韩电影| 2023国产一二三区日本精品2022| 日本午夜精品一区二区三区电影| 成人a级免费电影| 国产剧情一区在线| 国产精品77777竹菊影视小说| 日日夜夜精品免费视频| 99久久精品国产一区| 国产成人精品免费一区二区| 国产69精品一区二区亚洲孕妇| 奇米色一区二区| 国产在线不卡一区| 成人aaaa免费全部观看| 樱花影视一区二区| 日韩一区国产二区欧美三区| 欧美日韩视频一区二区| 亚洲丰满少妇videoshd| 精品精品国产高清一毛片一天堂| 久久你懂得1024| www久久久久| 国产精品网曝门| 日韩精品一区二区三区四区| 欧美xxx久久| 亚洲一区二区三区四区五区黄| 国产精品毛片无遮挡高清| 污片在线观看一区二区 | 国产精品 日产精品 欧美精品| 丝瓜av网站精品一区二区| 国产精品欧美一区二区三区| 一区二区三区小说| voyeur盗摄精品| 久久精品国产久精国产| av一二三不卡影片| 欧美性受极品xxxx喷水| 久久亚洲私人国产精品va媚药| 国产精品理伦片| 国产精品综合久久| www日韩大片| 久久精品一二三| 国产精品卡一卡二卡三| 最新国产成人在线观看| 国产寡妇亲子伦一区二区| 成人亚洲一区二区一| 懂色av噜噜一区二区三区av| 99综合影院在线| 国产日韩欧美电影| 国产麻豆一精品一av一免费| 国产午夜精品一区二区三区四区| 国产日韩av一区| 欧美日韩国产高清一区| 制服丝袜中文字幕一区| 国产日韩欧美电影| 色综合久久久久综合体| 亚洲一区二区三区四区中文字幕| 亚洲国产成人av| 国产+成+人+亚洲欧洲自线| 成人中文字幕合集| 1024成人网| 久久国产精品72免费观看| 欧美r级电影在线观看| 亚洲精品你懂的| 国产综合成人久久大片91| 国产校园另类小说区| 色香蕉成人二区免费| 久久99国产精品成人| 欧美中文字幕一区| 精品一区二区国语对白| 亚洲一区影音先锋| 91丨九色丨国产丨porny| 亚洲影视在线播放| 欧美α欧美αv大片| 亚洲日本在线看| 成人av在线资源| 国产色综合一区| 欧美一区二区在线免费观看| 成人开心网精品视频| 国产一区二区三区四区在线观看 | 国产精品538一区二区在线| 午夜欧美大尺度福利影院在线看 | 91色.com| 国产麻豆精品95视频| 亚洲午夜久久久久久久久电影院| 久久69国产一区二区蜜臀| 欧美麻豆精品久久久久久| 欧美激情在线看| 91女人视频在线观看| 日韩影院精彩在线| 国产一级精品在线| 国产欧美日韩精品一区| av不卡在线播放| 三级久久三级久久| 国产欧美日本一区视频| 亚洲人成电影网站色mp4| av资源网一区| 亚洲精品在线观看视频| 懂色av中文字幕一区二区三区| 色老综合老女人久久久| 日韩精品中文字幕在线一区| 极品瑜伽女神91| 91理论电影在线观看| 日本中文在线一区| 中文字幕在线不卡国产视频| 无吗不卡中文字幕| 日韩欧美成人午夜| 亚洲色欲色欲www在线观看| 91色在线porny| 国产欧美一区二区精品婷婷| 午夜在线电影亚洲一区| 国产精品久久影院| 国产成人无遮挡在线视频| 樱桃国产成人精品视频| 久久亚洲免费视频| 亚洲123区在线观看| 日本电影欧美片| 99综合电影在线视频| 高清av一区二区| 国产成人日日夜夜| 国产亚洲精品久| 盗摄精品av一区二区三区| 日韩一区二区电影网| 91首页免费视频| 亚洲国产成人av| 欧美成人伊人久久综合网| 欧美精品电影在线播放| 在线观看视频一区| 肉肉av福利一精品导航| 精品三级在线看| 日韩视频一区二区| 免费一区二区视频| 久久99精品国产.久久久久久| 夜夜爽夜夜爽精品视频| 欧美日韩国产美女| 91精品黄色片免费大全| 欧美电视剧在线看免费| 久久久蜜桃精品| 亚洲午夜精品久久久久久久久| 91精品国产综合久久婷婷香蕉 | 亚洲国产精品久久人人爱| 亚洲成av人在线观看| 久久久亚洲国产美女国产盗摄 | 欧美日免费三级在线| 国产亚洲视频系列| 日韩电影免费一区| 99精品1区2区| 丰满岳乱妇一区二区三区| 色综合咪咪久久| 国产精品美女久久久久aⅴ| 蜜臀av性久久久久蜜臀aⅴ| 国产精品女人毛片| 国产亚洲精品久| 老司机免费视频一区二区| 日韩专区中文字幕一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩午夜在线| 国产午夜亚洲精品午夜鲁丝片| 亚洲一区二区三区四区五区中文| 久久99精品国产91久久来源| 日韩一区二区三区高清免费看看| 精品亚洲国产成人av制服丝袜| 色妞www精品视频| 在线观看视频一区二区| 欧美狂野另类xxxxoooo| 亚洲综合激情另类小说区| 欧美在线免费观看视频| 亚洲国产精品一区二区www在线| 亚洲福利视频导航| 捆绑调教美女网站视频一区| 久久成人麻豆午夜电影| 成人午夜私人影院| 国产精品每日更新在线播放网址| 国产一区二区精品久久91| 欧美亚洲自拍偷拍| 亚洲gay无套男同| 高清不卡一区二区在线| 亚洲精品视频一区二区| 日韩一区二区电影| 99re66热这里只有精品3直播 | 粉嫩aⅴ一区二区三区四区五区| 亚洲国产精品黑人久久久| 国产精品国产三级国产专播品爱网| 欧美成人bangbros| 欧美日韩www| 日韩三级精品电影久久久| 日av在线不卡| 97精品久久久午夜一区二区三区| 粉嫩嫩av羞羞动漫久久久| 国产日韩v精品一区二区| 国产精品久久一级| 国产精品亚洲第一| 久久97超碰色| 在线观看视频一区| www.欧美日韩| 欧美色图在线观看| 国产剧情一区二区三区| 免费的成人av| 韩国视频一区二区| 六月婷婷色综合| 日韩一区二区三区三四区视频在线观看| 国产日产精品一区|