使用redis实现并发锁

前言

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。同时也是最流行的键值对存储数据库(之一)。

在这里插入图片描述
由于其基于内存的特性,在使用上轻量高速,在面对并发场景时,可以基于其构建并发锁(分布式锁)。

分布式锁一般有三种实现方式:

  1. 数据库锁
  2. 基于Redis的分布式锁
  3. 基于ZooKeeper的分布式锁

在这里插入图片描述

实现

import redis

def get_redis_client(host, port, db):
    redis_client = redis.Redis(
        host=host, port=port, db=db, decode_responses=True)
    return redis_client

# 获取锁,锁过期时间默认30s
def acquire_lock(lock_key, time_out=30):
    # 生成唯一id
    identifier = str(lock_key)
    lock_key = "lock_key:" + lock_key
    with get_redis_client() as redis_client:
        # setnx & expire, 只有key不存在情况下,将key的值设置为value,若key存在则不做任何动作。
        if redis_client.set(lock_key, identifier, nx=True, ex=time_out):
            return identifier
    return False
 
 
# 锁的释放
def release_lock(lock_key, identifier):
    lock_key = "lock_key:" + lock_key
    with get_redis_client() as redis_client:
        try:
            if redis_client.get(lock_key) == identifier:  # 检查客户端是否仍然持有该锁
                # 删除键,释放锁
                redis_client.delete(lock_key)
                return True
        except redis.exceptions.WatchError:
            # 锁释放失败
            print(f"release_lock {lock_key} has exceptions.")
        return False

if __name__ == "__main__":
    wait_flag = True
    lock_key = 'test_key'
    while wait_flag:
        identifier = acquire_lock(lock_key) # 获取锁
        if identifier:
            try:
                pass #正常处理
            except Exception:
                pass #异常处理
            finally:
                wait_flag = False
                release_flag = release_lock(lock_key, identifier) # 释放锁

在这里插入图片描述

参考资料

[1] Mac快速安装使用Redis
[2] Docs » Redis 命令参考
[3] python基于redis实现分布式锁
[4] redis操作五种数据的命令说明
[5] Redis:解决分布式高并发修改同一个Key的问题
[6] Python实现了一个基于redis的分布式可重入锁,Redis
[7] 分布式锁解决并发的三种实现方式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracelessLe

❀点个赞加个关注再走吧❀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值