服务端多线程如何防止多个客户端同时登陆成功同一个账号?

账号和密码存在数据库里,如果是排队一个一个查的话,那多线程就没啥意义了吧,而且像微信这种那么多用户的,一个一个登陆不太现实吧?

另外,会不会有那种极端情况,同时注销账号和登陆账号,前脚刚注销掉,后脚就登陆成功了。

会不会是我想太多,杞人忧天?

求大佬解惑 :eyes:

想想购物平台的秒杀系统,库存数量有限,但是秒杀开始的一瞬间怎么保证用户下单成功数量小于库存。所以线程锁了解一下

计算机远比你想象的快,并发用户远比你想象的少,单点登录把登录放在一起就行了,真遇到瓶颈你也可以按ID分流,比如hash一致性或者直接简单取模

我理解的线程锁,是相当于多线程转成单线程了,同一时间只能有一个客户端执行登陆。至于秒杀系统,跟我这个问题好像不太贴切吧,库存里的货物是相同的东西,而每个用户的账号密码却是唯一的。

即使很少,难道就不处理了嘛,万一发生了或者有人刻意去做这种事情,那不是很大的纰漏? :eyes:

开发阶段尽量避免过度设计,当然,解决方法我也说了,后期改动量也不大

因为你对单线程多线程 还有同步异步处理的概念 有些混淆,所以才会有这些问题的出现

2赞

工作任务多线程而已,不代表不能有共用的功能,最简单的是内存sync同步,还有比较常见的是redis登录状态同步,反正记住一个关键词,互斥。
另外有比较高端的做法,通过例如hash环等方法定位,让同一个用户的指令只能在一个线程排队做。

image
这部分解答
有不少坑货写的程序确实有你讲的问题。
一般正常的后端不会,但做法又各有差异,比如要先确认:是否允许多端登录、是否允许多端同时操作、或者某些操作可以多端,这些都定下来之后再确定方案。
总结一句,只要不是坑货写的后端,你就不需要杞人忧天,不会有问题的,最简单理解就是:你操作得再快再“同时”,也会有先后顺序。

消息队列 客户端来的消息都要先进到队列里 按顺序处理;
例如,mmorpg 所谓的多线程 实际上一般一个地图也是单线程的,切换地图的时候可能换线程,一个地图内的所有玩家都是一个线程

看上去你对多线程和锁应该不怎么熟悉,或者对后端的一些概念不大熟悉,建议补充一下~希望对你有帮助,或者百度一下即可

加锁不是单线程哥 我让别人访问完你再访问 保证安全性

每次调用登录生成一个临时的会话验签存在服务器缓存里面,后面每次请求都需要携带验签,跟服务器缓存验签不一致的客户端踢掉就行了