一、乐观锁
原理: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