《并发扣款,如何保证数据的一致性?》一文的核心观点是:使用CAS乐观锁,在写回余额时加上旧余额的比对,可以在不影响吞吐量的前提下,保证余额的一致性。
redis如何实现事务性?本质也是乐观锁。
$money = GET key$money = $money - $diffSET key $money
在并发量大的时候,会遇到和《并发扣款,如何保证数据的一致性?》中描述的并发一致性问题。
- WATCH观察key是否被改动
- 如果提交时key被改动,EXEC将返回null,表示事务失败
WATCH key$money = GET key$money = $money - $diffMULTISET key $moneyEXEC
在WATCH之后,EXEC执行之前,如果key的值发生变化,则EXEC会失败。redis的WATCH为何能够保证事务性,本质上,它使用的就是乐观锁CAS机制。
在CAS机制这一点上,redis和mysql相比没有额外的优势。
任何脱离业务的架构设计都是耍流氓。
本文转自“架构师之路”公众号,58沈剑提供。