用Redis實現分布式鎖 與 實現任務佇列

2021-08-14 17:04:43 字數 1086 閱讀 5504

這一次總結和分享用redis實現分布式鎖 與 實現任務佇列 這兩大強大的功能。先扯點個人觀點,之前我看了一篇博文說的文章大部分都是分享**,博文裡強調說分享思路比分享**更重要(貌似大概是這個意思,若有誤請諒解),但我覺得,分享思路固然重要,但有了思路,卻沒有實現的**,那會讓人覺得很浮誇的,在工作中的程式猿都知道,你去實現乙個功能模組,一段**,雖然你有了思路,但是實現的過程也是很耗時的,特別是**除錯,還有各種測試等等。所以我認為,思路+**,才是一篇好博文的主要核心。

直接進入主題。

一、前言

雙十一剛過不久,大家都知道在天貓、京東、蘇寧等等電商**上有很多秒殺活動,例如在某乙個時刻搶購乙個原價1999現在秒殺價只要999的手機時,會迎來乙個使用者請求的高峰期,可能會有幾十萬幾百萬的併發量,來搶這個手機,在高併發的情形下會對資料庫伺服器或者是檔案伺服器應用伺服器造成巨大的壓力,嚴重時說不定就宕機了,另乙個問題是,秒殺的東西都是有量的,例如一款手機只有10臺的量秒殺,那麼,在高併發的情況下,成千上萬條資料更新資料庫(例如10臺的量被人搶一台就會在資料集某些記錄下 減1),那次這個時候的先後順序是很亂的,很容易出現10臺的量,搶到的人就不止10個這種嚴重的問題。那麼,以後所說的問題我們該如何去解決呢? 接下來我所分享的技術就可以拿來處理以上的問題: 分布式鎖 和 任務佇列。

二、實現思路

1.redis實現分布式鎖思路

思路很簡單,主要用到的redis函式是setnx(),這個應該是實現分布式鎖最主要的函式。首先是將某一任務標識名(這裡用lock:order作為標識名的例子)作為鍵存到redis裡,並為其設個過期時間,如果是還有lock:order請求過來,先是通過setnx()看看是否能將lock:order插入到redis裡,可以的話就返回true,不可以就返回false。當然,在我的**裡會比這個思路複雜一些,我會在分析**時進一步說明。

2.redis實現任務佇列

這裡的實現會用到上面的redis分布式的鎖機制,主要是用到了redis裡的有序集合這一資料結構。例如入隊時,通過zset的add()函式進行入隊,而出對時,可以用到zset的getscore()函式。另外還可以彈出頂部的幾個任務。

以上就是實現 分布式鎖 和 任務佇列 的簡單思路,如果你看完有點模稜兩可,那請看接下來的**實現。

用redis實現分布式鎖

通常部署的服務都是在多台伺服器上,不會只有一台。那麼在分布式環境下,就會遇到共享資源的問題。比如乙個人只能有一條記錄,下次進來就只能修改,而不是再新增。如果只有一台伺服器,可以使用多執行緒下的單例模式來控制,但是分布式下,就不管用了。有三種方式,一是使用資料庫的樂觀鎖,二是redis的鎖,三是zoo...

python 用redis實現分布式鎖

在 redis 中設定值,預設,不存在則建立,存在則修改。引數 1.ex 過期時間 秒 這裡過期時間是3秒,3秒後p,鍵food的值就變成none import redis,time redis client redis.strictredis host localhost port 6379,db...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...