开篇
同一个用户并发扣款时,有一定概率出现数据不一致,可以使用CAS乐观锁的方式,在不降低吞吐量,保证数据的一致性:
不能采用直接扣减的方式:
当然,更通用的方式,可以使用版本号来实现CAS乐观锁:
WHERE uid=$uid AND ver=$ver_old;
对于这个CAS乐观锁方案,很有朋友有疑问:当并发量高时,版本号比对会导致大量的更新失败,这个方案不适用于高并发场景吗? 究竟是不是这样呢?大家对高并发是不是有什么误解呢?今天来聊一聊这个话题。
先分析三个业务场景。
一、QQ
QQ的一些核心业务有:
-
个人:user(uid, user_info, …)
-
好友:user_friends(uid, friend_id, …)
-
加入的群: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属性。
例如,拉取好友列表:
在用户量很大,并发量很大时,不同用户/群/消息数据的读写并没有锁冲突。
只有当,同一个用户,很短的时间内,有大量并发时,才可能存在锁冲突。
二、微博微博的核心业务是feed流:
-
发消息,写操作
-
刷消息,读操作
微博业务显然是读多写少的,在用户刷消息时,自己feed流里的消息,是由别人发出的。
查看自己主页feed流,最朴素的实现方法是:
(1) 拉取自己关注的用户id_list;
(2) 拉取这些用户最近N条消息;
(3) 将这N*id_list条消息排序;
(4) 返回第一页消息,得到自己主页feed流;
三、1230612306的核心业务是:
-
查票,读操作
-
买票,写操作
在用户量很大,并发量很大时,有极大的锁冲突。
收尾
QQ,微博、12306,同样是高并发业务,就数据存储锁冲突来说,各自的难度,数据不一致的概率是不同的。
回到开篇,使用CAS乐观锁进库存扣减:
WHERE uid=$uid AND ver=$ver_old;
只要有uid这个过滤属性,即使10W用户同时扣款,也不容易出现数据不一致。 只有当同一个用户,同一秒钟,有大量扣减时,才有一定几率会冲撞,但也不会导致数据不一致。
结论
高并发的扣款场景,可以使用CAS乐观锁,采用select&set方式进行扣款,既能够保证吞吐量,又能够保证一致性。
欢迎关注公众号:“Java架构师学习”
你会喜欢的!
相关推荐
友盟分享集成QQ/微信/微博的自定义面板分享,希望可以给予你帮助
本人花了一天的时间整理,对于想学,或者是项目中要用到第三方登录有很大的帮助,代码思路非常清晰,很容易理解,你们只要修改一个Ouath.properties配置文件,将里面的信息配置成自己的即可。
[搜酷狗微博]-首次提供公测(Tsokugo micro-Bo Ver 1.0.04.11),从现在开始您就可以关注我的微博啦!水岸心晴设计工作室,首次免费提供个人微博系统。 功能包括: 1、图片上传/图片缩略图/图片水印自动生成/网络...
漂亮实用的一款jQuery网页浮动在线QQ客服代码,可以设置微信和微博二维码图片,供用户扫描加好友,很适合现在社交网络应用,不过QQ号码只能设置一个,要添加多个的需要自己去修改了。
本微博类似一个交友的平台,用户可以通过微博发表一个即使短信息,让自 己的朋友对自己当前的心情或其他各方面有所了解,此短信息就像是QQ空间中发表的心情。用户还可以通过此微博搜索好友,添加关注好友。
该资料集成了QQ和新浪微博一键登录网站的技术,基于thinkphp3.2.2开发
微信,QQ登录认证也都能工作,唯独微博的登录认证没跑通,因为没有去注册应用,不过登录认证的界面是调起来的了。 支付相关代码也都翻译完了,但由于没有相应的服务端,所以这两个都没有跑通。
源码openshare,楼主做iOS开发的过程中遇到这样的问题:自己app中的信息需要分享到QQ、微信、微博等社交网络。现在的客户端越做越强大,直接集成了分享功能,比如用户手机上安装了微信,只需要app调起微信,并且给...
QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具箱(Q绑老密微博)QQ查询万能工具...
微博(Micro-Blog)顾名思义是微型博客,是一种基于用户关系的信息分享和传播平台,用户可通过浏览器、手机、及时通讯软件(MSN、 QQ、 Skype 等)及外部 API 接口等多种渠道发布 140 字以内信息[1]。 支持跨平台交流、 ...
java实现qq、微博登录,demon,实例
千寻QQ社区-QQ微博转发软件用于微博转发工具
网页QQ/微信/新浪微博等重要文件监控,方便发现文件变动,及时更新相关项目
腾讯QQ微博分享
QQ微博刷听众源码.e
html分享到新浪 QQ好友 QQ空间 腾讯微博
Flutter 截图、QQ分享、微信分享、微博分享
网页分享插件,可以实现微信、QQ、微博分享,内附有实例demo,简单易懂
高仿QQ微博(源码) 是用QQ微博接口,android系统高仿腾讯微博程序源码,带apk-android high imitation Tencent microblogging program source code, with the apk....
欢迎大家使用火车侠订票注册。免费版可以自动登录和在IE中打开。注册版可以自动订票提交订单,提交过程中...有效的增加了订票的可能性。 感谢大家使用。更多请联系QQ317379184或者q317379184.oicp.net QQ群81547758