面试题答案
一键面试- SETNX(SET if Not eXists):
- 适用场景 - 分布式锁:在分布式系统中,多个节点可能同时尝试获取锁。SETNX 命令可以用来实现简单的分布式锁。当一个节点执行
SETNX lock_key value
时,如果lock_key
不存在,该命令会设置lock_key
为value
并返回 1,表示获取锁成功;如果lock_key
已经存在,命令返回 0,表示获取锁失败。这样就可以保证同一时间只有一个节点能获取到锁。例如,在一个电商系统中,多个订单处理服务可能同时尝试处理同一个商品的下单操作,通过 SETNX 实现的分布式锁可以确保同一商品在同一时间只有一个订单处理服务在操作库存,避免超卖。
- 适用场景 - 分布式锁:在分布式系统中,多个节点可能同时尝试获取锁。SETNX 命令可以用来实现简单的分布式锁。当一个节点执行
- INCR(Increment)和 DECR(Decrement):
- 适用场景 - 库存控制:在库存管理场景中,INCR 可用于增加库存,DECR 可用于减少库存。例如,当有新的商品入库时,可以使用
INCR stock_key
来增加库存数量;当有商品被下单时,使用DECR stock_key
来减少库存。由于 Redis 是单线程执行命令,所以 INCR 和 DECR 操作是原子性的,在并发环境下不会出现数据不一致问题。在秒杀场景中,系统高并发地处理商品购买请求,通过 DECR 命令减少库存,可以保证库存数量的准确扣减,避免超卖情况发生。
- 适用场景 - 库存控制:在库存管理场景中,INCR 可用于增加库存,DECR 可用于减少库存。例如,当有新的商品入库时,可以使用
- WATCH:
- 适用场景 - 复杂业务逻辑并发控制:WATCH 命令可以用于监控一个或多个键,当使用 MULTI 开启事务后,如果被 WATCH 的键在事务执行之前被其他客户端修改,那么整个事务会被取消。例如在银行转账场景中,假设要从账户 A 向账户 B 转账,首先使用 WATCH 监控账户 A 和账户 B 的余额键,然后开启事务,在事务中从账户 A 的余额键减去转账金额,向账户 B 的余额键加上转账金额。如果在事务执行前,账户 A 或账户 B 的余额被其他操作修改了,那么整个事务会失败,从而保证了转账操作的数据一致性。