用redlock实现redis的分布式锁

本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机须要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:python

  1. 实例化锁:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
  2. 获取锁:rlock.acquire(),获取锁以后才能执行程序。
  3. 释放锁:rlock.release(),程序执行完以后,要释放锁,否者其余程序就阻塞,一直执行不了。

完整代码以下:redis

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

 总结,咱们使用锁的缘由,就是让并发的程序造成阻塞,并发能够引发的问题是数据不一致的状况,使用锁,造成阻塞,排队使用数据,就不会形成数据不一致的问题了,固然了,阻塞确定会下降效率了,速度要慢不少。app

相关文章
相关标签/搜索