余额并发扣减同等性,可否行使Redis事宜?
《并发扣款,怎样担保数据的同等性?》一文的焦点概念是:行使CAS乐观锁,在写回余额时加上旧余额的比对,可以在不影响吞吐量的条件下,担保余额的同等性。 文章很是多伴侣留言问,能不能把余额放到reids里,操作redis的事宜性来扣减余额。本日,就这个题目简朴的说一下。 redis怎样实现事宜性? 本质也是乐观锁。 在redis客户端执行:
在并发量大的时辰,会碰着和《并发扣款,怎样担保数据的同等性?》中描写的并发同等性题目。 redis的WATCH和EXEC可以提供相同事宜的机制:
上面担保同等性的余额扣减也许相同于这样执行:
在WATCH之后,EXEC执行之前,假如key的值产生变革,则EXEC会失败。redis的WATCH为何可以或许担保事宜性,本质上,它行使的就是乐观锁CAS机制。 大部门环境下,redis差异的客户端会会见差异的key,以是WATCH碰撞的概率会较量小,在秒杀的营业场景,纵然行使WATCH,挪用侧如故必要重试。 画外音:如《同样是高并发,QQ/微博/12306的架构难度一样吗?》所述,key的会见会过滤uid属性,以是可以支持高并发。 在CAS机制这一点上,redis和mysql对比没有特另外上风。 redis的机能之以是高,照旧redis内存会见与mysql数据落盘的差别导致的。内存会见的不敷是,数据具备“易失性”,假如重启,也许导致数据的丢失。虽然redis也可以固化数据,但假如每次都刷盘,redis反而机能会降落许多。 画外音:每个器材都有本身的合用场景,不宜将缓存当数据库用。 最后,redis用单线程来停止物理锁,但mysql多线程也有多线程并发的上风。 画外音:各有是非。 结论:可以行使redis的事宜性扣减余额,但在CAS机制上比mysql没有上风,高机能是由于其内存存储的缘故起因,带来的副浸染是数据有丢失风险。 任何离开营业的架构计划都是耍混混。 【本文为51CTO专栏作者“58沈剑”原创稿件,转载请接洽原作者】 戳这里,看该作者更多好文
(编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |