面试题答案
一键面试- 具体步骤:
- 步骤一:监视库存键
- 使用
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
,表示事务执行失败,客户端可以根据这个结果决定是否重试整个操作流程。
- 执行
- 步骤一:监视库存键
- 涉及的Redis命令:
- WATCH:用于监视一个或多个键,语法为
WATCH key [key ...]
。 - MULTI:开启一个事务块,后续命令进入事务队列,语法为
MULTI
。 - GET:获取指定键的值,语法为
GET key
。 - DECR:将指定键存储的数字值减1,语法为
DECR key
。 - EXEC:执行事务队列中的命令,语法为
EXEC
。
- WATCH:用于监视一个或多个键,语法为