高并发一致性解决方案

高并发场景有抢红包,双十一抢商品等。

如何去处理这些高并发场景呢?
1.从存储介质考虑:有内存缓存和磁盘缓存,内存缓存的速度是比磁盘缓存要高出几十倍的,因此可以考虑存储介质在内存上。想象一下如果抢红包的时候同时有2万个请求到达服务器,我相信使用数据库来储存这些红包数据的话,服务器会爆掉的,就算不爆掉,请求超时也是意料之中的,因此需要采用内存缓存的方式来处理这么多请求,将数据暂时存储在内存中,当红包抢完的时候再将内存中的数据通过事物操作,一次性写入到数据库中。
2.从数据一致性考虑:同时有2万个请求请求红包,这些请求都是对同一个红包进行红包总额的减法操作,因此存在公共数据访问的并发问题。处理并发问题有两种方式:第一是悲观锁(独占锁),第二是乐观锁(可重入锁)。第一种锁独占锁是一种阻塞情况最为严重的方式,就是给数据加上独占锁,其他线程想写这个数据的话就会被挂起,只有获取这个数据的线程才有权限写入这个数据,这样的话就存在大量线程挂起,和竞争锁的情况对于cpu是极大的消耗,效率低下。
第二种是给数据添加一个版本标识,每当有线程对其进行修改那么就把版本加一,这样当线程进行非原子操作的时候,一开始就保存了版本号,进行到修改数据的时候比较一下最新的版本号和久版本号是否一样,一样就修改不一样就重试(次数重试和时间重试两种)。
3.从计算机硬件考虑。单台服务器不可靠,坏了一台就可能导致服务不能使用,因此可采用主从架构或者是哨兵模式。

服务器使用SpringMVC+spring+myBatis+Redis架构

Redis可以用来进行内存缓存,独占锁的实现是在sql语句上实现的,对行锁定。可重入锁是代码实现,判定旧版本号是否和新的一致,不一致重试。

猜你喜欢

转载自blog.csdn.net/u012345683/article/details/78577010