# 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...