91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決python-redis-lock分布式鎖的問題

發布時間:2021-11-01 09:11:22 來源:億速云 閱讀:178 作者:iii 欄目:開發技術

本篇內容介紹了“怎么解決python-redis-lock分布式鎖的問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

問題背景

在使用celery執行我們的異步任務時,為了提高效率,celery可以開啟多個進程來啟動對應的worker。
但是會出現這么一種情況:在獲取到數據源之后要對數據庫進行掃描,根據UUID來斷定是插入還是更新,兩個worker 同時 (相差0.001S)拿到了UUID但是在其中一個沒插入時,另一個也掃描完了數據庫,這時這兩個worker都會認為自己拿到的UUID是在數據庫中沒有存在過的,所以都會調用INSERT方法來進行插入操作。

幾種解決方案

為了解決這個問題,一般有如下解決方案.
分布式鎖家族:

數據庫:

  • 排它鎖(悲觀鎖)

  • 樂觀鎖

Redis

  1. 自己實現Redis SET SETNX 操作,結合Lua腳本確保原子操作

  2. RedLock Redis里分布式鎖實現的算法,爭議比較大,謹慎使用

  3. python-redis-lock 本文將要介紹的技術。這個庫提供的分布式鎖很靈活,是否需要超時?是否需要自動刷新?是否要阻塞?都是可選的。沒有最好的算法,只有最合適的算法,開發人員應該根據實際需求場景謹慎選擇具體用哪一種技術去實現。

Zookeeper
這個應該是功能最強大的,比較專業,穩定性好。我還沒使用過,日后玩明白了再寫篇文章總結一下。

擴展思路

在celery的場景下也可以使用celery_once進行任務去重操作, celery_once底層也是使用redis進行實現的。
可以參考這篇

Talk is cheap, show me your code!

一個簡單的demo

import random
import time
import threading
import redis_lock
import redis

HOST = 'YOUR IP LOCATE'
PORT = '6379'
PASSWORD = 'password'


def get_redis():
    pool = redis.ConnectionPool(host=HOST, port=PORT, password=PASSWORD, decode_responses=True, db=2)
    r = redis.Redis(connection_pool=pool)
    return r


def ask_lock(uuid):
    lock = redis_lock.Lock(get_redis(), uuid)
    if lock.acquire(blocking=False):
        print(" %s Got the lock." % uuid)
        time.sleep(5)
        lock.release()
        print(" %s Release the lock." % uuid)
    else:
        print(" %s Someone else has the lock." % uuid)


def simulate():
   for i in range(10):
        id = random.randint(0, 5)
        t = threading.Thread(target=ask_lock, args=(str(id)))
        t.start()


simulate()

Output:

 4 Got the lock.
 5 Got the lock.
 3 Got the lock.
 5 Someone else has the lock.
 5 Someone else has the lock.
 2 Got the lock.
 5 Someone else has the lock.
 4 Someone else has the lock.
 3 Someone else has the lock.
 3 Someone else has the lock.
 2 Release the lock.
 5 Release the lock.
 4 Release the lock.
 3 Release the lock.

“怎么解決python-redis-lock分布式鎖的問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳高县| 永川市| 巴彦淖尔市| 盐津县| 时尚| 兴仁县| 宜章县| 清河县| 炉霍县| 永丰县| 万荣县| 西充县| 正定县| 许昌市| 呼和浩特市| 松阳县| 滕州市| 黑水县| 曲靖市| 玛纳斯县| 北票市| 济南市| 独山县| 芦山县| 定日县| 蒲城县| 阿坝| 临沧市| 桐乡市| 陈巴尔虎旗| 临猗县| 米泉市| 获嘉县| 大田县| 横山县| 海安县| 昌江| 平原县| 新平| 土默特右旗| 田阳县|