Redis事务原子性体现
- 命令入队:在Redis事务中,使用
MULTI
开启事务后,后续的命令不会立即执行,而是被放入一个队列中。直到执行EXEC
命令,队列中的所有命令才会被顺序执行。
- 整体执行:一旦执行
EXEC
,Redis会将事务队列中的所有命令作为一个整体执行,要么全部成功执行,要么因为某些错误(如语法错误等)一个都不执行。中途不会被其他客户端的命令打断。例如,在一个事务中既有SET key1 value1
又有INCR key2
,这两个操作会作为一个整体要么都成功,要么都失败。
电商库存扣减利用Redis事务原子性保证数据一致性
- 事务操作流程:
- 当用户下单时,开启Redis事务,先使用
WATCH
命令监控库存键(例如stock_key
)。WATCH
用于检测在事务执行之前,被监控的键是否被其他客户端修改。
- 然后使用
GET
命令获取当前库存数量。
- 根据业务逻辑判断库存是否足够,如果足够,使用
DECR
命令扣减库存。
- 最后执行
EXEC
提交事务。
- 示例代码(以Python和redis - py库为例):
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
with r.pipeline() as pipe:
stock_key ='stock:product1'
try:
pipe.watch(stock_key)
stock = pipe.get(stock_key)
if stock is None or int(stock) < 1:
print('库存不足')
pipe.unwatch()
return
pipe.multi()
pipe.decr(stock_key)
pipe.execute()
print('库存扣减成功')
except redis.WatchError:
print('库存已被其他操作修改,重试')
一致性在电商库存扣减场景中的体现
- 数据一致性:在电商库存扣减场景中,一致性意味着库存数量的变化与订单的处理是协调一致的。如果订单成功创建,库存必须相应减少;如果订单失败(例如库存不足),库存不应发生变化。Redis事务的原子性确保了这一过程的一致性,因为事务中的所有命令要么全部执行,要么全部不执行。
- 业务一致性:从业务角度看,一致性体现为用户看到的库存数量与实际可购买数量相符。例如,当多个用户同时下单抢购商品时,由于Redis事务的原子性,不会出现库存超卖的情况,保证了业务层面的一致性,即每个用户的购买操作都基于正确的库存状态进行,并且操作结果符合业务预期。