国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Redis - 如何使用Redis鎖處理并發(fā)問題詳解

如何使用Redis鎖處理并發(fā)問題詳解

2019-11-26 15:36haofly Redis

這篇文章主要給大家介紹了關(guān)于如何使用Redis鎖處理并發(fā)問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

上周“被”上線了一個緊急項目,周五下班接到需求,周一開始思考解決方案,周三開發(fā)完成,周四走流程上線,也算是面向領(lǐng)導編程了。之前的項目里面由于是自運維,然后大多數(shù)又都趕時間,所以在處理定時任務(wù)上面基本都是自己在服務(wù)器上添加crontab,而不是讓多個實例自己去處理定時任務(wù)的并發(fā)鎖,并且Laravel 5.5開始自帶并發(fā)鎖,我們也快升級了。但是這次項目是Python項目,無奈只能自己實現(xiàn)一下,以下這個方案實現(xiàn)起來非常簡單且易于理解。

?
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
import redis
r = redis.Redis(...)
 
last_heart = 0      # 記錄上一次得到的鎖心跳
free_lock_try = 6   # 鎖無心跳的最大次數(shù)
 
while not r.setnx('mylock', 1):
 now_heart = r.get('mylock')
 print(f"沒獲取到鎖,now_heart={now_heart},last_heart={last_heart},free_lock_try={free_lock_try}")
 if now_heart == last_heart:
  free_lock_try = free_lock_try - 1
  if free_lock_try == 0:    # 鎖已經(jīng)1分鐘沒有心跳了
   old_heart = r.getset('mylock', 1)    # 將lock重置為1,并返回set之前的心跳值
   if old_heart < now_heart:
    time.sleep(10)
    continue
   else:
    break   # 成功獲取到鎖,退出循環(huán)
 else:
  free_lock_try = 6 # 鎖有心跳,重置free_lock_try值
  last_heart = now_heart
 time.sleep(10)
 
def producer_exit():
 """程序正常退出時候自動清理鎖"""
 r.delete('mylock')
import atexit
atexit.register(producer_exit)
 
# 業(yè)務(wù)代碼
while True:
 r.incr('mylock')   # 讓鎖心跳加一
 ...

我們來看看這段程序都解決了并發(fā)鎖中的哪些問題

  • 高并發(fā)下,多個進程無法同時獲取到鎖。這里使用的是redis.setnx,如果鎖已經(jīng)存在,其他進程是無法重置鎖并獲取到鎖的。另外當多個進程同時發(fā)現(xiàn)有鎖已經(jīng)沒有心跳了,使用的是redis.getset將心跳重置為1,都能set成功,但是get出來的值多個進程是不一樣的,只有真正獲取到鎖的進程返回的是之前進程的心跳,而其他進程獲取到的都是1。
  • 有鎖進程正常退出,可以使用atexit注冊進程退出函數(shù)刪除鎖,這里也可以不要,不過下次啟動得等新的進程等待幾次心跳
  • 有鎖進程意外退出,退出后心跳不再增加,超過free_lock_try次數(shù)后,其他進程會重新設(shè)置并獲取鎖
  • 所有進程全都意外退出,這個問題不是鎖來關(guān)心的,可以使用supervisor進行守護進程。

導致Redis并發(fā)原因解釋

正所謂只有知其然才能知其所以然,只有弄明白問題出現(xiàn)的原因所在,才能對癥下藥,尋找解決問題的良方。眾所周知,Redis程序采用單線程模式進行運行,作為單線程程序,Redis客戶端的命令是逐條執(zhí)行,也叫做One by One執(zhí)行。既然是逐條命令執(zhí)行,從表面上來看Redis似乎不存在高并發(fā)的問題,這一觀點論也有道理,原子性的Redis命令本身也確實不存在高并發(fā)問題,這與多線程下的程序勃然不同。但是我們項目工作搭建Redis環(huán)境之后,通常都會是一組命令集合執(zhí)行程序,一個請求中就包含了N個Redis執(zhí)行命令,再加上多個客戶端請求,命令就更多了,導致連接超時、數(shù)據(jù)混亂或錯誤、請求阻塞等多種問題。

即總結(jié)為,產(chǎn)生Redis并發(fā)誘因是程序中的業(yè)務(wù)復雜度導致。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://haofly.net/redis-lock-handle-concurrency/

延伸 · 閱讀

精彩推薦
  • RedisRedis的配置、啟動、操作和關(guān)閉方法

    Redis的配置、啟動、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關(guān)閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis 事務(wù)知識點相關(guān)總結(jié)

    Redis 事務(wù)知識點相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農(nóng)5812019-11-18
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis實現(xiàn)排行榜功能

    redis實現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復制與部分復制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數(shù)db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復制基礎(chǔ)上實現(xiàn)高可用的...

    李留廣10222021-08-09
主站蜘蛛池模板: 免费观看一区二区三区毛片软件 | 一级大片av | 久草在线视频网 | 爱干视频 | 午夜私人影院 | 久久亚洲国产精品日日av夜夜 | 99精品欧美一区二区三区综合在线 | 视频在线一区 | 婷婷在线视频 | 综合久久网 | 国产精品成人一区二区 | 夜本色| 精品一区av | 久久伊人国产 | 精品国产精品三级精品av网址 | 极品一区| 狠狠操夜夜爱 | 黄色视屏在线免费观看 | 免费av观看 | 中文视频在线 | 国产欧美视频一区二区三区 | av人人看 | 精品久久久久一区二区国产 | 日韩欧美在线观看一区二区 | 精品免费国产一区二区三区四区 | 日韩欧美中文字幕在线观看 | 精品久久久久一区二区国产 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲一级一片 | 国偷自产一区二区免费视频 | 国产中文字幕亚洲 | 国产探花在线精品一区二区 | 日韩在线成人av | 欧洲一级视频 | 中文字幕亚洲一区二区三区 | 欧美日韩高清 | 欧美一区二区免费在线 | 欧美激情国产精品 | 狠狠爱网站 | 午夜小视频在线观看 | 国产精品亚洲一区二区三区 |