我是啞巴
嗯,每當我們在本地系統中工作時,一切都像黃油一樣工作。這就是為什麼我們稱「沒有比 127.0.0.1 更好的地方了」,但醒來面對現實
生產中的事情並不總是按預期進行。大多數情況下,當您執行應用程式的多個實例時。
?正如您所看到的,如果我們的應用程式的多個執行個體正在運行,並且假設我們的客戶端發出請求,將使用者標記為資料庫中的付費使用者。
- 客戶端將請求我們的伺服器
- 請求將到達我們的負載平衡器
- 其中一個實例將收到請求並向我們的資料庫發出寫入查詢
看起來還不錯吧?到目前為止沒問題吧。
嗯,是的,到目前為止沒有問題。但是如果我們想寫這樣的業務邏輯怎麼辦:-
- 從資料庫取得使用者
- 檢查使用者是否為免費使用者或已付費
- 如果免費,則將其標記為付費並保存在資料庫中
- 如果已付款,請在回覆中發送「已付款」。
⚡️ 眾所周知(假設我們在這裡使用 MySQL)MySQL 資料庫符合 ACID,這意味著任何查詢都將是原子的和隔離的。這意味著 MySQL 查詢將以原子方式運行,要么通過,要么失敗。但中間不會退出。
?但這裡有一個問題。想想,想想…
- 第 1 步:我們正在取得使用者(原子交易)
- 第 2 步:在程式碼中執行一些業務邏輯
- 第3步:如果使用者未付款則更新MySQL記錄(原子交易)
如果在第 2 步,又一個取消付款的請求,然後該查詢首先運行並將用戶標記為免費,然後運行第 3 步並將用戶標記為已付費,會發生什麼情況。
??萬歲,使用者甚至無需付費即可存取我們的產品。
鎖定
✅救星Locks來了
?鎖是一種結構,一次只允許一個執行緒進入臨界區(不應被多個工作執行緒存取的程式碼區塊)
因此,我們將在操作完成之前取得鎖定並在操作完成後釋放:-
- 第0步:嘗試取得()鎖定
- 第 1 步:如果獲取,我們將獲取使用者(原子事務)
- 第 2 步:在程式碼中執行一些業務邏輯
- 第3步:如果使用者未付款則更新MySQL記錄(原子事務)
- 第四步:release() 鎖
?問題
現在,問題來了,如果我們使用一些記憶體鎖資料結構或任何基於記憶體的鎖,它將有資格獲得我們應用程式的一個實例。其他運行相同程式碼並在資料庫中更新的實例怎麼樣?
分散式鎖的概念來了
?分散式鎖
這裡的鎖充當一種集中式服務,如果我們服務的一個實例取得了鎖,那麼其他實例就無法使用同一個金鑰。
支付服務中可以使用什麼鍵?
?對於進行付款的用戶,金鑰可以是=“PAYMENT_”+ user_id + amount
的組合這對每個使用者來說都是唯一的。並且當用戶付款或取消付款時,該密鑰將保持不變。因此,當一個操作發生時,其他操作無法繼續,因為這兩個操作將嘗試取得相同鍵。
? Key、取得鎖、釋放鎖到底是什麼?最重要的是,redis 是如何使用的?
?使用Redis實現分散式鎖
使用 Redis 的單一實例:-
但是單一 Redis 實例存在以下幾個問題:-
- 單一實例可能會失敗且取得的鎖定可能無法釋放
- 如果使用兩個實例(主副本),則一個客戶端將取得一個實例上的鎖定
- 主伺服器必須與副本進行相同的通訊才能同步。這種通訊本身就是非同步通訊
?因此,如果在主伺服器上取得了鎖,並且在與副本通訊時,如果主伺服器在與副本同步之前發生故障。副本將成為主伺服器,其中相同金鑰上的鎖將可用於取得先前在主伺服器上取得的鎖。
即使有兩個實例(主副本),我們服務的兩個實例也將能夠取得 Redis 上的鎖。
使用 Redlock 演算法:-
取得鎖定:- 我們將嘗試在具有鎖定過期時間的多個 Redis 實例上取得鎖定
鎖定驗證:- 如果主要 Redis 實例為客戶端取得了鎖,則將被視為已取得鎖定
釋放鎖定:- 釋放鎖定時,所有實例都釋放鎖定
是的,就是這樣。
❤️ 感謝您的閱讀,並訂閱我們的時事通訊以獲取更多此類文章:- https://www.serversidedigest.com/
欲了解更多:-
- Java 中的 Jedis:- https://redis.io/docs/latest/develop/connect/clients/java/jedis/
- Golang 中的 Redis 用戶端:- https://github.com/redis/go-redis
以上是如何使用Redis實現分散式鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

Java的五大特色是多態性、Lambda表達式、StreamsAPI、泛型和異常處理。 1.多態性讓不同類的對象可以作為共同基類的對象使用。 2.Lambda表達式使代碼更簡潔,特別適合處理集合和流。 3.StreamsAPI高效處理大數據集,支持聲明式操作。 4.泛型提供類型安全和重用性,編譯時捕獲類型錯誤。 5.異常處理幫助優雅處理錯誤,編寫可靠軟件。

java'stopfeatureSnificallyenhanceItsperformanCandScalability.1)對象 - 方向clincipleslike-polymormormormormormormormormormormormorableableflexibleandscalablecode.2)garbageCollectionAutectionAutoctionAutoctionAutoctionAutoctionAutoctionAutoMenateMememorymanateMmanateMmanateMmanagementButCancausElatemention.3)

JVM的核心組件包括ClassLoader、RuntimeDataArea和ExecutionEngine。 1)ClassLoader負責加載、鏈接和初始化類和接口。 2)RuntimeDataArea包含MethodArea、Heap、Stack、PCRegister和NativeMethodStacks。 3)ExecutionEngine由Interpreter、JITCompiler和GarbageCollector組成,負責bytecode的執行和優化。

Java'ssafetyandsecurityarebolsteredby:1)strongtyping,whichpreventstype-relatederrors;2)automaticmemorymanagementviagarbagecollection,reducingmemory-relatedvulnerabilities;3)sandboxing,isolatingcodefromthesystem;and4)robustexceptionhandling,ensuringgr

Javaoffersseveralkeyfeaturesthatenhancecodingskills:1)對象 - 方向 - 方向上的allowslowsmodelowsmodelingreal-worldentities

thejvmisacrucialcomponentthatrunsjavacodebytranslatingitolachine特定結構,影響性能,安全性和便攜性。 1)theclassloaderloader,links andinitializesClasses.2)theexecutionEngineExecutionEngineExecutionEngineExecuteNexeCuteByteCuteByteCuteByTecuteByteCuteByteCuteBytecuteBytecuteByteCoDeinintolachineinstructionsions.3)Memo.3)Memo


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器