Redis分布式非公平鎖的使用

2022-09-21 01:24:08 字數 2587 閱讀 6083

目錄

看了很多部落格,和資料,這裡只針對redis做分布式鎖做一下深入**,希望對你們有obwmx幫助。網上提供了很多分布式鎖的操作,這裡逐一舉例然後評論優缺點及改進方案,希望這樣子能讓當家更好的理解redis分布式鎖。

大家應該都知道redis做分布式鎖無非就是incr命令或者是setnx命令,這裡我們採用setnx命令。

操作:setnx key 如果操作成功則代表拿到鎖,如果沒有操作成功則代表沒有拿到鎖。

缺點:如果這個人拿到鎖後宕機了怎麼辦,那麼這個鎖就再也不能釋放了。

改進:給這個鎖增加乙個過期時間,這樣如果有效期過了,那麼這個鎖就會自動釋放了。

通過上面所說我們應該對redis分布式進行改進。

操作: 使用setnx 命令,之後,在expireat key 30000 這條命令設定key的有效期為30秒。

這裡我們可能會發現,如果要是剛setnx結束之後,要是宕機了。怎麼辦?那麼我們為了保證原子性,所以jedis提供了乙個原子操作,set(key,value,nx,30,時間單位)這樣便解決了。

缺點:如果這個鎖的時間不夠用怎麼辦,那麼就會導致這個功能鎖不住。假設:a拿到鎖了,但是a還沒有執行結束,b又拿到鎖了,那麼a執行結束的時候是不是會把b的這個鎖給刪除掉。這樣就導致了鎖不住的效果。

改進:我們可以學習樂觀所,給鎖的value值是乙個唯一的編號,或者版本號,我們每次對鎖進行操作的時候,就會去驗證這個版本號,還是不是自己的版本號。如果不是了就不允許操作了。

通過上面的總結這第三版想必也很簡單了。知識多了乙個唯一值而已。但是加了唯一值還是改變不了鎖不住的結果,只是解決了幫其他的執行緒解鎖的問題,那麼要怎麼樣才能鎖得住呢?當時我想到的是給他 時間久一點,後來發現其實再久,也一樣會出現鎖不住的時候,而且太久了如果宕機了,就會有很長時間機器無法工作,很容易造成執行緒堆積。

由上面我們發現一般簡單實用redis做鎖其實是有很多漏洞和bug的,但是有沒有能夠解決這些的呢?當然是有的。

模仿aqs鎖, lock方法執行完之後,執行下面**是被鎖的,unlock執行完,釋放鎖。其他執行緒等待,而不是直接返回錯誤結果。

最終版還是打算先上**再說,為了方便我把所有的實現都寫在了乙個類裡面。

@autowired

private redistemplate redistemplate;

@autowired

private redisutils redisutils;

@autowired(required = false)

private threadpooltaskscheduler threadpooltaskscheduler;

public final string lock_prefix = "redis_lock";

private final long lock_expire = 30 * 1000l;

private final long over_time = 10l;

private mapobwmxtring,scheduledfuture> > futuremap = new concurrenthashmap<>();

private jedis jedis;

public lock()

private reentrantlock reentrantlock;

/***www.cppcns.com 給執行緒枷鎖

** @param key

*/public void lock(string key)

},new trigger()

});return;}}

}/**

* setnx

** @param key

* @return

*/public boolean setlock(string key) else }}

return false;

}});

}/**

* 刪除鎖

** @param key

*/public void unlock(string key)

}/**

* 判斷key是否存在

** @param key 鍵

* @return true 存在 false不存在

*/public boolean haskey(string key) catch (exception e)

}public set scan(string key) else

}return keys;

});}

分析:

加鎖執行原理:

解鎖操作原理:

解鎖操作就比較簡單了。但是得為了不出必要的麻煩,最好是給停止鎖延時任務,和刪除所 這兩部新增程序鎖,可以使用synchron程式設計客棧ized,也可以使用aqs lock鎖。

這裡redis非公平鎖詳解算是結束了,後期可能會更新使用redis,實現公平鎖,謝謝大家的支援,如果有需要的小夥伴可以直接拿走,希望能給大家帶來幫助。

在這裡我希望看過文章的小夥伴能夠根絕實現原理自己去實現,這樣可以幫助小夥伴理解非公平鎖機制,和redis實現非公平,如果不喜歡自己去實現的話,這裡我給大家推薦乙個redission 這個外掛程式,這個外掛程式是乙個redis鎖的很好的乙個實現,大家可以直接用這個。具體怎麼用就不講解了,操作非常簡單。

Redis分布式非公平鎖詳解

大家應該都知道redis做分布式鎖無非就是incr命令或者是setnx命令,這裡我們採用setnx命令。操作 setnx key 如果操作成功則代表拿到鎖,如果沒有操作成功則代表沒有拿到鎖。缺點 如果這個人拿到鎖後宕機了怎麼辦,那麼這個鎖就再也不能釋放了。改進 給這個鎖增加乙個過期時間,這樣如果有效...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...