【⚡ Cache伺服器 - Redis】🔐鎖住那個Bug, 讓資料不再互搶飯碗 🍚

更新 發佈閱讀 6 分鐘

Redis 的分佈式鎖(Distributed Lock)是一種利用 Redis 作為儲存媒介來控制多個應用實例之間對共享資源的訪問權限的機制, 它常用於避免多個服務同時修改同一筆資料,進而產生資料不一致的情況。


我們在「【資訊軟體知識】「鎖」的兩極化,樂觀與悲觀」有分享關於「鎖」的重要知識點, 歡迎先行閱讀, 再搭配這篇Redis的知識點, 比較容易融會貫通唷!


🔧 基本概念

raw-image


🔐 加鎖

import uuid
import redis

r = redis.Redis(host='localhost', port=6379, db=0)

lock_key = "my_lock"
lock_value = str(uuid.uuid4()) # 每次加鎖都生成唯一值
lock_ttl = 10 # seconds

# 嘗試加鎖
acquired = r.set(lock_key, lock_value, nx=True, ex=lock_ttl)
if acquired:
print("✅ 獲得鎖")
else:
print("❌ 鎖被佔用")



🔓 釋放鎖(要確保是自己持有的才釋放)


unlock_script = """
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
"""

r.eval(unlock_script, 1, lock_key, lock_value)
print("🔓 鎖已釋放")



📦 搭配第三方套件更簡單

我們可以使用 Redlock-py 這個套件來讓我們使用鎖更加的方便, 它將我們複雜的細節進行封裝, 只需要簡單的使用 「🔐 加鎖和釋放」。

from redlock import Redlock

dlm = Redlock([
{"host": "localhost", "port": 6379, "db": 0},
# 可加入多個 Redis 節點來提高可靠性
])

# 嘗試取得鎖
lock = dlm.lock("resource_key", 10000) # 10

if lock:
print("✅ 獲得分佈式鎖")
# 做你的事情...

dlm.unlock(lock) # 解鎖
print("🔓 鎖已釋放")
else:
print("❌ 鎖被佔用")



🧊 適時的封裝讓複雜的程式更加簡易

import uuid
import redis

class RedisLock:
def __init__(self, redis_client, lock_key, ttl=10):
self.redis = redis_client
self.lock_key = lock_key
self.ttl = ttl
self.lock_value = str(uuid.uuid4())

def acquire(self):
return self.redis.set(self.lock_key, self.lock_value, nx=True, ex=self.ttl)

def release(self):
unlock_script = """
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
"""
return self.redis.eval(unlock_script, 1, self.lock_key, self.lock_value)

def __enter__(self):
if not self.acquire():
raise RuntimeError(f"Failed to acquire lock: {self.lock_key}")
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.release()



🧪 使用範例

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

with RedisLock(r, "my_lock", ttl=10):
print("✅ 取得鎖,執行關鍵區塊")
# 在這裡做你的事,比如寫入資料庫、處理任務等等

print("🔓 鎖已釋放")



結語

不管是資料庫、快取伺服器, 只要牽涉到多機, 相信大部分都會有「鎖」的機制, 避免因為大量併發而導致資料異常, 當然我們也可以使用隊列來解決這個問題, 但實作上相對複雜許多, 對於小量場景的應用情境來說, 簡易的「鎖」已經能夠滿足, 當然我們還有一些更深入的使用技巧, 之後有遇到適合的場景也會在留言版進行分享, 與大家共同學習成長。

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
139會員
303內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/05/28
我們在「【🔒 Cache伺服器 - Redis】流式數據處理 - Redis Stream」有介紹關於Stream如何在串流架構下發揮作用, 這個主題我們要來分享一下如何像串流一般持續的部份更新JSON內容, 在開始進入主題之前, 我們先稍微簡介一下Redis JSON吧! Redis JS
Thumbnail
2025/05/28
我們在「【🔒 Cache伺服器 - Redis】流式數據處理 - Redis Stream」有介紹關於Stream如何在串流架構下發揮作用, 這個主題我們要來分享一下如何像串流一般持續的部份更新JSON內容, 在開始進入主題之前, 我們先稍微簡介一下Redis JSON吧! Redis JS
Thumbnail
2025/05/07
有時候我們的API會處理運算功能, 因此會設計為多機來進行分散運算的作業, 但問題來了! 假設我們設計一個修改的API, 修改某個值, 但其它機器的API究竟要如何知曉並更新值呢? 這時候就需要來個通知與訂閱 我們在佇列系列主題有提到Queue的概念, 歡迎參考一下, 這會與我們的通知訂
Thumbnail
2025/05/07
有時候我們的API會處理運算功能, 因此會設計為多機來進行分散運算的作業, 但問題來了! 假設我們設計一個修改的API, 修改某個值, 但其它機器的API究竟要如何知曉並更新值呢? 這時候就需要來個通知與訂閱 我們在佇列系列主題有提到Queue的概念, 歡迎參考一下, 這會與我們的通知訂
Thumbnail
2025/04/09
我們在「【⚡ Cache伺服器 - Redis】 讓系統服務更加順暢的快取機制」 分享如何使用Docker架設Redis, 在進入此篇章之前也請您親自架設一遍, 這樣才能加深學習的效果, 接下來我們會使用Python這套程式語言進行示範與說明, 讓我們以實戰的方式來練習, 將技術內化為知識, 達到真
Thumbnail
2025/04/09
我們在「【⚡ Cache伺服器 - Redis】 讓系統服務更加順暢的快取機制」 分享如何使用Docker架設Redis, 在進入此篇章之前也請您親自架設一遍, 這樣才能加深學習的效果, 接下來我們會使用Python這套程式語言進行示範與說明, 讓我們以實戰的方式來練習, 將技術內化為知識, 達到真
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
這時天網也鎖定原區域內300支電話,近日當地電信的資料庫,提取出300支可能與綁匪有關聯的電話號碼資料。數據庫篩選,使用大數據分析技術,從原區域內的資料庫中篩選出最近活躍且可疑的電話號碼。智能過濾,排除小孩和老年人的電話號碼,確保篩選出的電話號碼具有高度相關性。 電話監控操作,天網系統將這
Thumbnail
這時天網也鎖定原區域內300支電話,近日當地電信的資料庫,提取出300支可能與綁匪有關聯的電話號碼資料。數據庫篩選,使用大數據分析技術,從原區域內的資料庫中篩選出最近活躍且可疑的電話號碼。智能過濾,排除小孩和老年人的電話號碼,確保篩選出的電話號碼具有高度相關性。 電話監控操作,天網系統將這
Thumbnail
李天明了解到大型電腦系統,譬如銀行系統,都設有反駭客小組,專門針對系統漏洞進行測試,確保系統的安全性。他認為,公司的ERP系統和其他核心系統也需要這樣一個小組來保障安全,特別是在最近發現了多處漏洞後,這種需求顯得尤為迫切。 李天明決定將這個建議告訴黃瑜。一天上午,他敲響了黃瑜辦公室的門,進
Thumbnail
李天明了解到大型電腦系統,譬如銀行系統,都設有反駭客小組,專門針對系統漏洞進行測試,確保系統的安全性。他認為,公司的ERP系統和其他核心系統也需要這樣一個小組來保障安全,特別是在最近發現了多處漏洞後,這種需求顯得尤為迫切。 李天明決定將這個建議告訴黃瑜。一天上午,他敲響了黃瑜辦公室的門,進
Thumbnail
自從通訊軟體的發達,測試封鎖也變成熱門討論的一環,這個是給已知封鎖的狀態下測驗喔!
Thumbnail
自從通訊軟體的發達,測試封鎖也變成熱門討論的一環,這個是給已知封鎖的狀態下測驗喔!
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
為什麼要登出使用者? 安全性:防止未經授權的人,在使用者暫離時使用系統,這在公用或共享電腦的環境中尤其重要。 資料保護:只要使用者處於登入狀態,就會暴露在個人資料被他人操縱或利用的風險中,因此登出閒置使用者對資安也很重要。 如何在 Vue 3 專案中實作此功能?
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
雜湊、編碼和加密雖然在資訊安全中扮演不同的角色,但很多人往往容易搞混它們的用途,本篇文章將帶你了解他們的區別。
Thumbnail
雜湊、編碼和加密雖然在資訊安全中扮演不同的角色,但很多人往往容易搞混它們的用途,本篇文章將帶你了解他們的區別。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News