本文是一個demo,利用多進程,來模擬使用redis分布式鎖的使用場景。本機需要安裝redis,python3.7下運行代碼。分布式鎖用redlock這個包實現,實現步驟分三步:
- 實例化鎖:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
- 獲取鎖:rlock.acquire(),獲取鎖之后才能執行程序。
- 釋放鎖:rlock.release(),程序執行完之后,要釋放鎖,否者其他程序就阻塞,一直執行不了。
完整代碼如下:
# -*- coding: utf-8 -*- import os import arrow import redis from multiprocessing import Pool from redlock.lock import RedLock HOT_KEY = 'count' r = redis.Redis(host='localhost', port=6379) def seckilling(): name = os.getpid() v = r.get(HOT_KEY) if int(v) > 0: print (name, ' decr redis.') r.decr(HOT_KEY) else: print (name, ' can not set redis.', v) # def run_without_lock(name): while True: if arrow.now().second % 5 == 0: seckilling() return rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}]) def run_with_redis_lock(name): while True: if arrow.now().second % 5 == 0: # 二,獲取鎖 if rlock.acquire(): seckilling() # 釋放鎖 rlock.release() return if __name__ == '__main__': p = Pool(80) r.set(HOT_KEY, 1) for i in range(80): # p.apply_async(run_without_lock, args=(i,)) p.apply_async(run_with_redis_lock, args=(i,)) print ('now 16 processes are going to get lock!') p.close() p.join() print('All subprocesses done.')
使用鎖的代碼,主要是:
rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}]) def run_with_redis_lock(name): while True: if arrow.now().second % 5 == 0: # 二,獲取鎖 if rlock.acquire(): seckilling() # 釋放鎖 rlock.release() return
使用redlock得步驟很簡單,總結出來,一共四步:
# 一,實例化一把鎖 rlock
from redlock.lock import RedLock
rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
# 二,獲取鎖 if rlock.acquire(): # 三,需要鎖住形成阻塞得程序 seckilling() # 四,釋放鎖 rlock.release()
總結,我們使用鎖的原因,就是讓並發的程序形成阻塞,並發可以引起的問題是數據不一致的情況,使用鎖,形成阻塞,排隊使用數據,就不會造成數據不一致的問題了,當然了,阻塞肯定會降低效率了,速度要慢很多。