开篇数据库
同一个用户并发扣款时,有必定几率出现数据不一致,可使用CAS乐观锁的方式,在不下降吞吐量,保证数据的一致性:架构
不能采用直接扣减的方式:并发
固然,更通用的方式,可使用版本号来实现CAS乐观锁:高并发
对于这个CAS乐观锁方案,颇有朋友有疑问:当并发量高时,版本号比对会致使大量的更新失败,这个方案不适用于高并发场景吗? 到底是不是这样呢?你们对高并发是否是有什么误解呢?今天来聊一聊这个话题。
先分析三个业务场景。 学习
1、QQ优化
QQ的一些核心业务有:ui
我的:user(uid, user_info, …)orm
好友:user_friends(uid, friend_id, …)cdn
加入的群:user_groups(uid, group_id, …)排序
群:group(gid, group_info, …)
群成员:group_members(gid, uid, …)
我的消息:msgs_user(msg_id, uid, …)
群消息:msgs_group(msg_id, gid, …)
这些信息的读写有一个特色,都会带上uid/gid/msgid属性。
例如,拉取好友列表:
在用户量很大,并发量很大时,不一样用户/群/消息数据的读写并无锁冲突。
只有当,同一个用户,很短的时间内,有大量并发时,才可能存在锁冲突。
2、微博微博的核心业务是feed流:
发消息,写操做
刷消息,读操做
微博业务显然是读多写少的,在用户刷消息时,本身feed流里的消息,是由别人发出的。
查看本身主页feed流,最朴素的实现方法是:
(1) 拉取本身关注的用户id_list;
(2) 拉取这些用户最近N条消息;
(3) 将这N*id_list条消息排序;
(4) 返回第一页消息,获得本身主页feed流;
3、1230612306的核心业务是:
查票,读操做
买票,写操做
在用户量很大,并发量很大时,有极大的锁冲突。
收尾
QQ,微博、12306,一样是高并发业务,就数据存储锁冲突来讲,各自的难度,数据不一致的几率是不一样的。
回到开篇,使用CAS乐观锁进库存扣减:
只要有uid这个过滤属性,即便10W用户同时扣款,也不容易出现数据不一致。 只有当同一个用户,同一秒钟,有大量扣减时,才有必定概率会冲撞,但也不会致使数据不一致。
结论
高并发的扣款场景,可使用CAS乐观锁,采用select&set方式进行扣款,既可以保证吞吐量,又可以保证一致性。
欢迎关注公众号:“Java架构师学习”
你会喜欢的!