1. 程式人生 > >關於redis 鎖(分散式鎖)的問題

關於redis 鎖(分散式鎖)的問題

首先,工作中的redis是從阿里獲取的資源,工作需求有搶紅包和簽到的功能需求,這時就難免出現併發,因而涉及到鎖的問題,網上搜了搜相關知識

不少是用setnx和getset實現,例如:http://blog.csdn.net/ugg/article/details/41894947 等等,個人認為考慮非常全面,但是感覺比較複雜,個人認為

可以通過redis incr命令來實現該功能,本人菜鳥,如果不妥,還望不吝賜教

具體邏輯:給一個key加鎖,通過incr命令,當個數為1的時候說明有執行緒獲得鎖,因而只要判斷是否大於1可以知道是否有人獲取鎖,再設定一個過期

時間,該期間內不斷的迴圈請求,獲取鎖則獲取,否則視為超時(超時處理比較粗糙,直接視為死鎖超時或者 返回失敗提示)

具體程式碼(java):

  long TIME_LIMIT = 3000;

  long getLockTime = 0;

  while(jedis.incr(lockKey) > 1 && getLockTime < TIME_LIMIT){

  // 等待時長為隨機的,最少為50毫秒左右,等待時長長短看人品

 long curWatiTime = 50 + Math.round(250 * Math.random());
getLockTime += curWatiTime;
Thread.sleep(curWatiTime);

 }

//防止程式中途遇到未知的問題,此時設定一個過期時間

jedis.expire(lockKey,1000);

//判斷當獲取鎖的時間超過時間限制了,丟擲異常(嚴謹起見)

  if(getLockTime > TIME_LIMIT){

  throw new Exception("get Lock failed , lockKey "+ lockKey +" locked");

  }

關鍵程式碼如上所示,獲取鎖的service呼叫該段程式碼的方法,當處理完自己的業務後,在finally模組刪除該key

釋放該鎖

具體設計看具體情況,如何使邏輯更加嚴謹,以及如何處理各種異常,如何給客戶端更為妥當的提示都是要考慮的

看過 setnx getset 實行redis鎖的相關文件

http://blog.csdn.net/ugg/article/details/41894947

相關推薦

實現基於redis分散式並整合spring-boot-starter

文章目錄 概述 使用 1.導包 2.寫一個實現鎖功能的service 3.檢查redis的key 4.呼叫(鎖成功) 5.呼叫(鎖失敗) 實現

Redis分散式的原理

一、使用分散式鎖要滿足的幾個條件: 系統是一個分散式系統(關鍵是分散式,單機的可以使用ReentrantLock或者synchronized程式碼塊來實現,即單程序多個執行緒訪問的話) 共享資源(各個系統訪問同一個資源,資源的載體可能是傳統關係型資料庫或者NoSQL) 同步訪問

redis】使用redisTemplate優雅地操作redis及使用redis實現分散式

前言: 上篇已經介紹了redis及如何安裝和叢集redis,這篇介紹如何通過工具優雅地操作redis. Long Long ago,程式猿們還在通過jedis來操作著redis,那時候的猿類,一個個累的沒日沒夜,重複的造著輪子,忙得沒時間陪家人,終於有一天猿類的春天來了,spring家族的r

【轉】【Redis分散式的幾種使用方式(redis、zookeeper、資料庫)

https://blog.csdn.net/u010963948/article/details/79006572?utm_source=blogxgwz9 https://blog.csdn.net/qq_37606901/article/details/79569250?utm_source

基於redis分散式(轉)

基於redis的分散式鎖 1 介紹 這篇博文講介紹如何一步步構建一個基於Redis的分散式鎖。會從最原始的版本開始,然後根據問題進行調整,最後完成一個較為合理的分散式鎖。 本篇文章會將分散式鎖的實現分為兩部分,一個是單機環境,另一個是叢集環境下的Redis鎖實現。在介紹分散式鎖的實

基於Redis實現分散式

背景 在很多網際網路產品應用中,有些場景需要加鎖處理,比如:秒殺,全域性遞增ID,樓層生成等等。大部分的解決方案是基於DB實現的,Redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶端對Redis的連線並不存在競爭關係。其次Redis提供一些命令SETNX,GETSET,可以方便

利用Redis實現分散式 使用mysql樂觀解決併發問題

寫在最前面 我在之前總結冪等性的時候,寫過一種分散式鎖的實現,可惜當時沒有真正應用過,著實的心虛啊。正好這段時間對這部分實踐了一下,也算是對之前填坑了。 分散式鎖按照網上的結論,大致分為三種:1、資料庫樂觀鎖; 2、基於Redis的分散式鎖;3.、基於ZooKeeper的分散式鎖; 關於樂觀鎖的實現其實

利用Redis實現分散式

為什麼需要分散式鎖? 在傳統單體應用單機部署的情況下,可以使用Java併發相關的鎖,如ReentrantLcok或synchronized進行互斥控制。但是,隨著業務發展的需要,原單體單機部署的系統,漸漸的被部署在多機器多JVM上同時提供服務,這使得原單機部署情況下的併發控制鎖策略失效了,為了解決這個問

如何用 Redis 實現分散式和超時情況處理

目前各種分散式的架構和微服務架構無處不在,在這種類似架構中處理併發和分散式併發問題,本場 Chat 就主要以 Redis 為例,使用分散式鎖的方式如何處理併發問題和避免超時情況的出現,主要從以下幾個方面講述: Redis 的 Setnx 命令是如何實現分散式鎖的; Setnx 的實現鎖的

dubbo 常用的基於redis分散式實現

  小弟本著先會用在學習原理的原則 先用了dubbo 現在在實際業務中 因為分散式專案做了叢集,需要用的分散式鎖,就用到了基於redis的分散式鎖,廢話不多說,先來程式碼: package com.tiancaibao.utils; import org.slf4j.Logger

[翻譯]基於redis分散式

本篇翻譯自【redis.io/topics/dist… 在很多不同程序必須以相互排斥的方式競爭分片資源的情況下,分散式鎖是非常有用的原始功能。 有很多的實現和部落格都描述瞭如何基於Redis來實現分散式鎖管理器(DLM,Distributed Lock Manager)。有的使用了不同的途徑,但是大多都是

使用redis分散式

1、使用setnx命令。先看下官方文件http://redis.cn/commands/setnx.html 2、使用getset命令。先獲取,再set   實現案例:    * create 2018-12-03 16:22 * <p> * desc **/ @Compo

ZooKeeper分散式簡單實踐 利用Redis實現分散式

寫在最前面 前幾周寫了篇 利用Redis實現分散式鎖 ,今天簡單總結下ZooKeeper實現分散式鎖的過程。其實生產上我只用過Redis或者資料庫的方式,之前還真沒了解過ZooKeeper怎麼實現分散式鎖。這周簡單寫了個小Demo,更堅定了我繼續使用Redis的信心了。 ZooKeep

Redis分散式

  一、加鎖原因      二、原子操作      三、分散式鎖      四、分散式鎖常見問題      一、加鎖原因      在一些比較高併發的業務場景,經常聽到通過加鎖的方法實現執行緒安全。      下面簡單介紹一下      1.1 加鎖方式      資料庫鎖      資料庫本身提供了鎖機制,

分散式-使用Redis實現分散式

使用Redis實現分散式鎖 關於分散式鎖的實現,我的前一篇文章講解了如何使用Zookeeper實現分散式鎖。關於分散式鎖的背景此處不再做贅述,我們直接討論下如何使用Redis實現分散式鎖。 關於Redis,筆主不打算做長篇大論的介紹,只介紹下Redis優秀的特性

REDIS 學習(10)流程圖解使用redis實現分散式

redis作為集中式快取,可以通過它來實現分散式鎖。 首先用到的redis操作有: setnx key value:      當key不存在的時候生效並返回1,當已經有此key的時候返回0 getset key value:    

RedLock演算法-使用redis實現分散式服務

譯自Redis官方文件 在多執行緒共享臨界資源的場景下,分散式鎖是一種非常重要的元件。 許多庫使用不同的方式使用redis實現一個分散式鎖管理。 其中有一部分簡單的實現方式可靠性不足,可以通過一些簡單的修改提高其可靠性。 這篇文章介紹了一種指導性的redis分散式鎖演算法RedLock,RedL

基於redis分散式 | 併發程式設計網

1 介紹 這篇博文講介紹如何一步步構建一個基於Redis的分散式鎖。會從最原始的版本開始,然後根據問題進行調整,最後完成一個較為合理的分散式鎖。 本篇文章會將分散式鎖的實現分為兩部分,一個是單機環境,另一個是叢集環境下的Redis鎖實現。在介紹分散式鎖的實現之前,先來了解下分散式鎖的一些資訊。 2 分散式

Redis實現分散式(spring定時任務叢集應用Redis分散式

         之前2片文章介紹了 描述:              不管用不用動態執行,單機服務都是沒有問題的,但是如果服務是叢集模式下,那麼一個任務在每臺機器都會執行一次,這肯定不是我們需要的,我們要實現的是整個叢集每次只有一個任務執行成功,但是spring

Redis實現分散式Redis實現分散式

前言 分散式鎖一般有三種實現方式:1. 資料庫樂觀鎖;2. 基於Redis的分散式鎖;3. 基於ZooKeeper的分散式鎖。本篇部落格將介紹第二種方式,基於Redis實現分散式鎖。雖然網上已經有各種介紹Redis分散式鎖實現的部落格,然而他們的實現卻有著各種各樣的問題,為