用redlock实现redis的分布式锁

本文介绍如何在Python中使用Redis分布式锁解决并发问题,通过多进程模拟秒杀场景,避免数据不一致,展示RedLock包的使用及其实现步骤。

本文是一个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

 总结,我们使用锁的原因,就是让并发的程序形成阻塞,并发可以引起的问题是数据不一致的情况,使用锁,形成阻塞,排队使用数据,就不会造成数据不一致的问题了,当然了,阻塞肯定会降低效率了,速度要慢很多。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值