MST

星途 面试题库

面试题:Redis事务中如何体现ACID性质的部分特性并举例说明

在Redis事务里,原子性(Atomicity)是如何体现的?请结合实际业务场景,如电商库存扣减,描述如何利用Redis事务的原子性来保证数据的一致性,同时简单阐述下一致性(Consistency)在这个场景中是怎样体现的。
12.6万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis事务原子性体现

  1. 命令入队:在Redis事务中,使用MULTI开启事务后,后续的命令不会立即执行,而是被放入一个队列中。直到执行EXEC命令,队列中的所有命令才会被顺序执行。
  2. 整体执行:一旦执行EXEC,Redis会将事务队列中的所有命令作为一个整体执行,要么全部成功执行,要么因为某些错误(如语法错误等)一个都不执行。中途不会被其他客户端的命令打断。例如,在一个事务中既有SET key1 value1又有INCR key2,这两个操作会作为一个整体要么都成功,要么都失败。

电商库存扣减利用Redis事务原子性保证数据一致性

  1. 事务操作流程
    • 当用户下单时,开启Redis事务,先使用WATCH命令监控库存键(例如stock_key)。WATCH用于检测在事务执行之前,被监控的键是否被其他客户端修改。
    • 然后使用GET命令获取当前库存数量。
    • 根据业务逻辑判断库存是否足够,如果足够,使用DECR命令扣减库存。
    • 最后执行EXEC提交事务。
  2. 示例代码(以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('库存已被其他操作修改,重试')

一致性在电商库存扣减场景中的体现

  1. 数据一致性:在电商库存扣减场景中,一致性意味着库存数量的变化与订单的处理是协调一致的。如果订单成功创建,库存必须相应减少;如果订单失败(例如库存不足),库存不应发生变化。Redis事务的原子性确保了这一过程的一致性,因为事务中的所有命令要么全部执行,要么全部不执行。
  2. 业务一致性:从业务角度看,一致性体现为用户看到的库存数量与实际可购买数量相符。例如,当多个用户同时下单抢购商品时,由于Redis事务的原子性,不会出现库存超卖的情况,保证了业务层面的一致性,即每个用户的购买操作都基于正确的库存状态进行,并且操作结果符合业务预期。