1. 乐观锁策略
- 原理:乐观锁假设在处理事务时很少会发生冲突。在读取数据时记录版本号,在写入数据时,检查版本号是否一致。如果一致则进行操作,否则重试。
- Redis实现:利用
WATCH
命令。例如在处理订单时,假设订单数据存储在Redis的哈希表中,键为order:123
,包含amount
(订单金额)等字段。
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 开启事务
pipe = r.pipeline()
# 监控订单数据
pipe.watch('order:123')
try:
# 获取订单金额
amount = pipe.hget('order:123', 'amount')
new_amount = int(amount) - 10 # 假设订单金额减少10
# 开始事务
pipe.multi()
pipe.hset('order:123', 'amount', new_amount)
pipe.execute()
except redis.WatchError:
# 版本号不一致,重试
print('乐观锁冲突,重试')
2. 悲观锁策略
- 原理:悲观锁假设在处理事务时很可能会发生冲突。在操作数据前先获取锁,只有获取到锁才能进行事务操作,操作完成后释放锁。
- Redis实现:使用
SETNX
(SET if Not eXists)命令实现简单的锁机制。例如:
import redis
import time
r = redis.Redis(host='localhost', port=6379, db=0)
lock_key = 'order_lock:123'
lock_value = time.time() + 10 # 锁的过期时间设置为10秒后
# 获取锁
if r.setnx(lock_key, lock_value):
try:
# 获取订单金额
amount = r.hget('order:123', 'amount')
new_amount = int(amount) - 10 # 假设订单金额减少10
r.hset('order:123', 'amount', new_amount)
finally:
# 释放锁
r.delete(lock_key)
else:
print('获取锁失败,等待重试')
3. 队列处理策略
- 原理:将订单请求放入队列中,按顺序处理,避免竞争条件。
- Redis实现:使用
RPUSH
和LPOP
命令实现简单的队列。例如:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 模拟订单请求入队
order_request = {'order_id': 123, 'amount': 100}
r.rpush('order_queue', str(order_request))
# 处理订单
while True:
order = r.lpop('order_queue')
if order:
# 解析订单数据并处理
order = eval(order)
# 执行订单处理逻辑,例如修改订单金额等
r.hset(f'order:{order["order_id"]}', 'amount', order['amount'] - 10)
else:
break