MST

星途 面试题库

面试题:Redis中WATCH命令在电商库存场景的应用

在电商场景中,商品库存通常存储在Redis中。假设要实现一个商品抢购功能,防止超卖现象,如何使用Redis的WATCH命令来保证库存操作的原子性?请描述具体步骤和涉及的Redis命令。
24.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 具体步骤
    • 步骤一:监视库存键
      • 使用WATCH命令监视存储商品库存的Redis键。例如,如果商品库存键为product:stock:123(假设123是商品ID),在客户端执行WATCH product:stock:123。这一步的作用是让Redis记住这个键的当前值。
    • 步骤二:开启事务
      • 执行MULTI命令开启一个事务块。此时客户端后续发送的Redis命令不会立即执行,而是被放入事务队列中。
    • 步骤三:检查库存并操作
      • 首先使用GET product:stock:123获取当前商品库存值。假设返回值为stock_value
      • 判断stock_value是否大于0,如果大于0,则执行DECR product:stock:123命令将库存减1,表示成功抢购一件商品;如果stock_value小于等于0,则表示库存不足,放弃操作(在事务内可以简单忽略DECR操作,因为事务执行时如果库存不足也不会执行减库存操作)。
    • 步骤四:执行事务
      • 执行EXEC命令,Redis会原子性地执行事务队列中的命令。如果在WATCH之后,product:stock:123键的值没有被其他客户端修改,事务会正常执行,库存会被正确减少;如果product:stock:123键的值被其他客户端修改了,EXEC命令会返回nil,表示事务执行失败,客户端可以根据这个结果决定是否重试整个操作流程。
  2. 涉及的Redis命令
    • WATCH:用于监视一个或多个键,语法为WATCH key [key ...]
    • MULTI:开启一个事务块,后续命令进入事务队列,语法为MULTI
    • GET:获取指定键的值,语法为GET key
    • DECR:将指定键存储的数字值减1,语法为DECR key
    • EXEC:执行事务队列中的命令,语法为EXEC