一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 解決python-redis-lock分布式鎖的問題

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

2022-02-21 00:29Loganer Python

這篇文章主要介紹了python-redis-lock分布式鎖的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

python-redis-lock

官方文檔
不錯的博文可參考

問題背景

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

幾種解決方案

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

數(shù)據(jù)庫:

  • 排它鎖(悲觀鎖)
  • 樂觀鎖

Redis

  1. 自己實(shí)現(xiàn)Redis SET SETNX 操作,結(jié)合Lua腳本確保原子操作
  2. RedLock Redis里分布式鎖實(shí)現(xiàn)的算法,爭議比較大,謹(jǐn)慎使用
  3. python-redis-lock 本文將要介紹的技術(shù)。這個庫提供的分布式鎖很靈活,是否需要超時?是否需要自動刷新?是否要阻塞?都是可選的。沒有最好的算法,只有最合適的算法,開發(fā)人員應(yīng)該根據(jù)實(shí)際需求場景謹(jǐn)慎選擇具體用哪一種技術(shù)去實(shí)現(xiàn)。

設(shè)計(jì)思路:

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

Zookeeper
這個應(yīng)該是功能最強(qiáng)大的,比較專業(yè),穩(wěn)定性好。我還沒使用過,日后玩明白了再寫篇文章總結(jié)一下。

擴(kuò)展思路

在celery的場景下也可以使用celery_once進(jìn)行任務(wù)去重操作, celery_once底層也是使用redis進(jìn)行實(shí)現(xiàn)的。
可以參考這篇

Talk is cheap, show me your code!

一個簡單的demo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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.

到此這篇關(guān)于python-redis-lock分布式鎖的文章就介紹到這了,更多相關(guān)python分布式鎖內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/wyh1618/article/details/120973410

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人操男人 | 黄a 大片a v 永久免费 | 国产一区二区三区在线看 | 99久久中文字幕伊人 | 91po国产在线高清福利 | 短篇最污的乱淫伦小说全集 | 海角社区在线视频 | 放荡的女老板bd中文字幕 | 国产成人影院 | 天天爱综合网 | 草逼的视频 | 国产久热香蕉在线观看 | 国产成人影院一区二区 | 久久久GOGO无码啪啪艺术 | 亚洲第一区欧美日韩精品 | 4hu影院永久在线播放 | 色综合中文字幕天天在线 | 国内精品久久久久久不卡影院 | 久久青青草视频在线观 | 亚洲国产欧美在线人成aaa | 热久久天天拍天天拍热久久2018 | 天天操天天干天天 | 99久久精品国产免费 | 成人国产在线视频在线观看 | 99ri在线视频网 | 日本无遮挡亲吻膜下面免费 | 超91精品手机国产在线 | sss亚洲国产欧美一区二区 | 5g在线观看| 男女男精品网站免费观看 | 91夜夜人人揉人人捏人人添 | 国产久热精品 | 国内交换一区二区三区 | 色综合色狠狠天天综合色hd | 欧美伊香蕉久久综合类网站 | 爱情岛论坛亚洲一号路线 | 国产精品自在线拍 | 精品无码一区在线观看 | 亚洲第一男人天堂 | 男女被爆动漫羞羞动漫 | 91久久碰国产 |