概念
什么原子性?程序在执行过程中,要么全部都执行,要么全部都不执行,不可能执行了一半,滞留了一半。我们知道redis是IO多路复用模型,即一个线程来处理多个TCP连接,这样的好处就是,即使客户端并发请求,也得排队处理,一定程度上解决了多线程模型带的并发问题,所以redis是并发安全的?从redis本身的架构模式来说,并发是安全的,不存在同时执行两个客户端的命令。但是如果因为某些业务场景用的有问题,那么即使是单线程的redis也无能为力。
库存问题
假设现在redis有个叫stock的key,用于存放商品的库存数据,只要进货了库存就加一,出货了库存就减一。于是这时候机智的程序员小王这样设计了一下,每次通过get获取stock的值,然后再set stock=stock+1。这时候有两个业务员A、B分别进货了,由于时间线的问题,程序大概是这样跑的:
- A先获取value=100
- B先获取value=100
- A设置value=101
- B设置value=101
整个流程下来,发现库存丢了一个,这正是因为整个操作不是原子性的,导致A影响了B,或者B影响了A。
解决方式
原生的原子命令
incr
是原子操作的,对于这种场景ÿ