Python 基於Redis實現乙個簡單的分布式鎖

2021-10-07 02:46:38 字數 2197 閱讀 6580

# redis_lock.py

import redis

import time

import threading

# 連線池方式

pool = redis.connectionpool(host=

'127.0.0.1'

,port=

6379

)redis_con = redis.redis(connection_pool=pool)

class

redislock

(object):

def__init__

(self)

: self.redis_con = redis_con

defget_lock

(self, val)

:while

true

: res = self.redis_con.

set(

'lock'

, val,nx=

true

, ex=3*

60)if res:

break

# print('繼續等待鎖...')

time.sleep(

0.1)

defdel_lock

(self, val)

: old_val = redis_con.get(

'lock'

)if old_val == val.encode():

self.redis_con.delete(

'lock'

)print

('鎖釋放成功'

)sums =

0def

test_lock

(lock, name, num, val)

:try

:print

('%s 開始工作'

% name)

print

('%s 準備獲取鎖並加鎖'

% name)

lock.get_lock(val)

print

('%s 得到鎖,繼續工作'

% name)

global sums

sums +=

15 time.sleep(num)

print

(sums)

except exception as e:

print

('發生異常:%s'

%str

(e))

finally

:print

('%s 操作完成,準備釋放鎖'

%name)

lock.del_lock(val)

if __name__ ==

'__main__'

: start_time = time.time(

) r_lock = redislock(

) tasks =

for num in

range(1

,4):

t = threading.thread(target=test_lock, args=

(r_lock,

'任務%d'

%num,num,

'lock%d'

%num)

) t.start(

)[item.join(

)for item in tasks]

print

('總耗時:'

, time.time(

)- start_time)

執行效果:

$ python redis_lock.py

任務1 開始工作

任務2 開始工作

任務2 準備獲取鎖並加鎖

任務3 開始工作

任務1 準備獲取鎖並加鎖

任務3 準備獲取鎖並加鎖

任務2 得到鎖,繼續工作

15任務2 操作完成,準備釋放鎖

鎖釋放成功

任務3 得到鎖,繼續工作

30任務3 操作完成,準備釋放鎖

鎖釋放成功

任務1 得到鎖,繼續工作

45任務1 操作完成,準備釋放鎖

鎖釋放成功

總耗時: 6.061553478240967

python基於redis實現分布式鎖

我們在開發應用的時候,如果需要對某乙個共享變數進行多執行緒同步訪問的時候,可以使用我們學到的鎖進行處理,並且可以完美的執行,毫無bug!注意這是單機應用,後來業務發展,需要做集群,乙個應用需要部署到幾台機器上然後做負載均衡,大致如下圖 上圖可以看到,變數a存在三個伺服器記憶體中 這個變數a主要體現是...

基於Redis實現的單點登入

背景 每個web應用都有自己的session,那如何在分布式或者集群環境下統一session,即如何實現單點登入,如下圖 解決方案 把session資料存放在redis,統一管理,向外提供服務介面,redis可以設定過期時間,對應session的失效時間 優點 訪問速度快,效率高 無單點故障,可以部...

spring基於redis實現訊息訂閱

本文主要記錄一下如何使用spring基於redis提供的pub sub模型來實現訊息的發布和訂閱處理,只記錄幾個需要注意的切入點.org.springframework.bootgroupid spring boot starter data redisartifactid 2.1.6.releas...