setnx 的原子性不是它自己实现的,而是"白嫖"了 Redis 单线程模型的红利。
在 Redis 里,命令是一条一条排队执行的。setnx 内部做两件事:检查 key 是否存在、不存在就设置。这两步在同一个命令里完成,中间不会被其他命令插入。所以对外看起来,setnx 就是"要么设置成功,要么什么都没发生",天然原子。
如果 Redis 是多线程的,setnx 内部这两步就可能被其他线程插入,那就需要加锁来保证原子性了。但 Redis 单线程,省了这些麻烦。
换句话说,原子性的来源有两个层次:
命令内部:SETNX 的实现把检查和写入放在一个函数里,中间没有"交出控制权"的机会。
命令之间:Redis 单线程,一个命令执行完才会执行下一个,所以 SETNX 执行期间不会被别的命令插入。
两者合起来,才让 SETNX 对外表现为"要么设置成功,要么什么都没发生"。
详细内容请看链接:https://www.vastark.cn/interviewer/problems/4b
模拟练习效果请看: https://www.vastark.cn/interviewer/ai-interview?page_id=P6A97EA7DAF\&site_id=S6A97D1FEAF

