python实现redis分布式锁
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/xiao_xia_ming/article/details/100564708
?import time
import redis
?
?
class RedisLock(object):
? ? def __init__(self, key):
? ? ? ? self.rdcon = redis.Redis(host='127.0.0.1', port=6379, password="", db=1)
? ? ? ? self._lock = 0
? ? ? ? self.lock_key = "%s_dynamic_test" % key
?
? ? @staticmethod
? ? def get_lock(cls, timeout=10):
? ? ? ? while cls._lock != 1:
? ? ? ? ? ? timestamp = time.time() + timeout + 1
? ? ? ? ? ? # 127.0.0.1:6379> SETNX 0 1567676678.05
? ? ? ? ? ? # (integer) 1
? ? ? ? ? ? # 127.0.0.1:6379> GET 0
? ? ? ? ? ? # 1567676678.05
? ? ? ? ? ? # 127.0.0.1:6379> GETSET 0 1567676678.05
? ? ? ? ? ? # 1567676678.05
? ? ? ? ? ? print cls._lock
? ? ? ? ? ? print timestamp
? ? ? ? ? ? # 商品秒殺
? ? ? ? ? ? cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp)
? ? ? ? ? ? if cls._lock == 1 or (time.time() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)):
? ? ? ? ? ? ? ? print "get lock"
? ? ? ? ? ? ? ? break
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? time.sleep(0.3)
?
? ? @staticmethod
? ? def release(cls):
? ? ? ? if time.time() < cls.rdcon.get(cls.lock_key):
? ? ? ? ? ? print "release lock"
? ? ? ? ? ? cls.rdcon.delete(cls.lock_key)
?
?
def deco(cls):
? ? def _deco(func):
? ? ? ? def __deco(*args, **kwargs):
? ? ? ? ? ? print "before %s called [%s]." % (func.__name__, cls)
? ? ? ? ? ? cls.get_lock(cls)
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? return func(*args, **kwargs)
? ? ? ? ? ? finally:
? ? ? ? ? ? ? ? cls.release(cls)
?
? ? ? ? return __deco
? ? return _deco
?
?
@deco(RedisLock("6666"))
def myfunc():
? ? print "myfunc() called."
? ? time.sleep(20)
?
?
if __name__ == "__main__":
? ? myfunc()
?
# 在傳統的基于數據庫的架構中,對于數據的搶占問題往往是通過數據庫事務(ACID)來保證的。
# 在分布式環境中,出于對性能以及一致性敏感度的要求,使得分布式鎖成為了一種比較常見而高效的解決方案。
?
# 使用場景:
# 某服務提供一組任務,A請求隨機從任務組中獲取一個任務;B請求隨機從任務組中獲取一個任務。
# 在理想的情況下,A從任務組中挑選一個任務,任務組刪除該任務,B從剩下的的任務中再挑一個,任務組刪除該任務。
# 同樣的,在真實情況下,如果不做任何處理,可能會出現A和B挑中了同一個任務的情況。
?
# 分布式鎖設計目標
# 可以保證在分布式部署的應用集群中,同一個方法在同一操作只能被一臺機器上的一個線程執行。
?
# 這把鎖要是一把可重入鎖(避免死鎖)
# 這把鎖最好是一把阻塞鎖(根據業務需求考慮要不要這條)
# 這把鎖有高可用的獲取鎖和釋放鎖功能
# 這把鎖獲取鎖和釋放鎖的性能要好……
?
# 商品提前設置到數據庫里面,當在分布式的場景下面,顧客搶占到商品后就可以進行相應的刪除
# 基于性能方面的考慮,redis相比mysql更有優勢(對redis實現集群配置,或者RDB,AOF備份等)
————————————————
版權聲明:本文為CSDN博主「xiao_xia_ming」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiao_xia_ming/article/details/100564708
總結
以上是生活随笔為你收集整理的python实现redis分布式锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锦鲤寓意象征意义(锦鲤寓意)
- 下一篇: 面试不懂分布式锁?那得多吃亏