作为后端开发,高并发场景是一个绕不过去的坎,今天就来整理下常见的几种思路(暂时不考虑分布式的情况)
一.并发锁
首先我们要知道高并发下会出现某一个时刻流量猛增,还有就是如果是抢购之类的库存类并发可能会导致超卖库存为负数之类的,对于并发锁来说主要是解决抢购超卖问题的,并不能很好的解决流量猛增给服务器带来的压力,有时候甚至会加重服务器的压力,所以我们并发量小及服务器配置比较高的时候可以用并发锁来处理,下面就介绍几种常用的并发锁
1.synchronize(同步排它锁)
这个对于java开发来说肯定不陌生,它可以让各个线程同步执行,缺点是极度的耗费性能,临时处理可以使用,经常使用的情况下不推荐
2.数据库锁
mysql数据库也是自带锁的,这种情况一般用行锁,不过这个会产生事务阻塞数据库,极度耗费性能,且容易造成死锁,一般在内部确定的极低的并发(一般就2个并发)的时候使用
3.redis锁
这个用的比较多,首先redis单进程且性能比较高,而且可以分布式实现,我们一般用set nx px 来实现
二.队列
当我们的流量达到一定的程度,服务器无法负载了,则就需要进行流量消峰了,这时候我们队列就可以排上用场了,这时候我们我们可以把请求推到队列中,然后及时响应请求,至于并发结果我们可以在另一个页面接口或者发邮件展示,这个个方法的缺点就是不能直接获取到队列请求的结果,不过也算是比较优秀的一种方式了
三.预存队列
上面我们提到了无法获取到队列请求的结果,有时候需要立刻展示的时候比较麻烦,这时候我们就可以倒转队列的消费者生产者了,先预先在队列中预存一定量的货物,让客户抢单请求来消费客户端的货物,这样就能通过是否从队列中取到货物来直接返回结果了,当前上面的请求都要注意好重复请求,重复下单的情况