用redlock實現redis的分布式鎖


本文是一個demo,利用多進程,來模擬使用redis分布式鎖的使用場景。本機需要安裝redis,python3.7下運行代碼。分布式鎖用redlock這個包實現,實現步驟分三步:

  1. 實例化鎖:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
  2. 獲取鎖:rlock.acquire(),獲取鎖之后才能執行程序。
  3. 釋放鎖: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()

 

總結,我們使用鎖的原因,就是讓並發的程序形成阻塞,並發可以引起的問題是數據不一致的情況,使用鎖,形成阻塞,排隊使用數據,就不會造成數據不一致的問題了,當然了,阻塞肯定會降低效率了,速度要慢很多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM