Redis实现并发下单乐观锁和悲观锁机制

一、乐观锁

原理:Redis事务中Watch监听的乐观锁机制,设置监听之后数据发生变化就会取消我们的下单返回nil,意思是监听了我们的库存之后,一旦出现并发下单就会取消我们的下单。并尝试重新下单。

示例:

from redis import StrictRedis, WatchError

redis_client = StrictRedis(host='127.0.0.1', port=6379, db=0, decode_responses=True)

# 创建管道对象
pipe = redis_client.pipeline()

while True:
    try:
        # 监听我们的数据,数据发生变化就会报异常
        pipe.watch('count')
        # 获取我们的库存数量
        count = pipe.get('count')
        # 判断我们的库存
        if int(count) > 0:
            # 添加事务
            pipe.multi()
            print('生成订单')
            # 减库
            pipe.decr('count')
            pipe.execute()

        else:
            print('商品售罄')
            # 无库存需要手动移除监听
            pipe.reset()
        break

    except WatchError as e:
        # 监听数据发生修改,重试进行数量判断while
        print('重试操作')

        # continue

二、悲观锁 

原理:setnx抢到锁返回1继续执行,抢不到就继续抢。

from redis import StrictRedis

# 创建redis连接
redis_client = StrictRedis(decode_responses=True)

# 设计redis悲观锁 处理秒杀超卖问题

# 先获取锁
while True:
    #如果锁被别人抢到了,就只能一直循环的抢
    # 直到del lock:order  语法 setnx key value == >> del key
    order_lock = redis_client.setnx('hh', 1)
    # 给锁设置过期时间 避免锁没有成功删除,出现死锁现象
    # redis_client.expire('lock:order', 2)
    if order_lock:
        reserve_count = redis_client.get('count')
        if int(reserve_count) > 0:
            redis_client.decr('count')
            print("生成订单")
        else:
            print("已售罄")
        # 完成处理, 移除锁
        redis_client.delete('lock:order')
        break


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值