栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用redis的setnx实现分布式锁(python实现)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用redis的setnx实现分布式锁(python实现)

背景:

在实际开发场景中,可能会出现多个服务可能会同时调用同一个方法的情况,但是想要保证在一定的时间内该方法只能被一个服务调用。

实现原理:

1.单线程:首先redis本身是单线程的,当有多个线程同时访问redis的时候,一定是一个一个线程的按照顺序的访问redis,因此这是使用redis实现分布式锁的一个原因。

2.原子性:setnx具有原子性,当有多个线程时,只会有一个线程可以使用setnx设置成功。

3.特点:当有重复的锁key的时候setnx查询缓存就会返回false或者空,那我们可以利用它的这种机制去实现多个服务的同时调用一个方法的时候让所有的服务都有互斥的效果。

具体实现代码:
import redis

class LockerException(Exception):
    pass

r = redis.Redis(host=REDIS_HOST, port=6379, decode_responses=True)
key_prefix = '项目名'

def set_nx(key, ex=60):
    if r.setnx(key_prefix+key, 1):
        r.expire(key_prefix+key, ex)
        return True
    elif r.ttl(key_prefix+key) == -1:
        r.expire(key_prefix + key, ex)
    return False

#  获取⼀个分布式锁
def acquire_lock(lock_name, ex):
    return set_nx(lock_name, ex)


# 释放锁
def release_lock(lock_name):
    del_(lock_name)

# 定义一个锁
def lock(lock_key, func, ex=60*5):
    locked = False
    try:
        locked = acquire_lock(lock_key, ex)
        if locked:
            func()
    except Exception as e:
        raise LockerException(e)
    finally:
        if locked:
            release_lock(lock_key)

# 使用分布式锁调用函数func_name
def run():
    lock('任务名称',func_name)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002042.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号