1、Topk问题
(1)从1000个数据中找到k个最大数据
首先看到这个题时,可能会想到先将这1000个数据进行降序排序,即取出的前k个元素最大。时间复杂度为O(N^2),使得程序效率低。
思路:
可先创建一个数组topK[k],将1000中的前k个数据放入数组topK中,将topK中的数据建小堆,则可保证堆的第一个元素是最小的,将第k个元素与堆中第一个元素比较,若大于,则交换。对堆进行重新建小堆,取第k+1个元素与堆中第一个元素比较,以此类推,直至1000-k个元素比较完。则此时堆中的元素就是k个最大数据。
时间复杂度为 k*lgk+N*lgk
当N庞大时,k可忽略,则时间复杂度为O(N),大大提高了效率。
(2)堆排序
既然是排序,那就有两种可能升序or降序。使得堆是建大堆方便还是建小堆方便。
<1>若为升序,则需要建大堆。
堆的第一个元素为最大,将最大元素与末尾元素交换,剩下的元素(除末尾元素)向下调整。
<2>若为降序,则需要建小堆。
堆的第一个元素为最小,将最小元素与末尾元素交换,剩下的元素(除末尾元素)向下调整。
2、秒杀问题
有限的商品,有限的资源,相对较大的人数,在某个时刻集中进行访问
要求:一个商品不能卖个两个人;相对来讲公平些,提交早的人先拿到
首先秒杀要有页面,页面有图片和视频等相对较大的静态资源,假如有500k的视频、图片,如果我们把这些存在服务器,一共有两万人同一时间访问这个页面,在这一秒共有多少流量
1000万k----10G,云服务器速度慢
如何解决这个问题
不把图片和视频放到服务器里,CDN(内容分发网络)
对于图片和视频的请求不会直接到服务器里,会导向就近服务节点上
OSS(静态资源存储)
秒杀是短时间内应对大流量的项目,不能说秒杀崩了之后网站崩
有人会提前去抢
要有时间控制,防止有人提前去抢,时间要以服务器为准
20万人,去抢五台机器,大部分的请求是没有用的,所以很多请求可以直接返回,特别是靠后的请求
一台Tomcat每秒500次处理,就算有1万请求也要有20台服务器,如何再优化,少一点
MQ
假如Tomcat来了请求和消息直接放入MQ当中,可以提升Tomcat单个的处理能力,MQ再去慢慢消化掉
MQ消费:如何防止超卖的问题,而且尽快处理
在redis中进行库存扣减,在redis中存一下当前能购买的数量,每消费一次就减一,如果redis中为0了,则后续直接返回失败,可以过滤一批
两个服务器同时都读到了redis的信息,然后-1返回,还是会出现超卖问题
在redis处理后的,再次封装进入第二个队列中,第二个队列只有一个消费者,这之后才是真正的去数据库中去进行商品秒杀的扣减,然后发订单之类的控制
两次队列防止超卖,不加锁是为了尽可能快的处理
适用于秒杀场景的:抢红包、商品秒杀、
红包问题:一对一红包、群红包(涉及,类似)、天降红包雨(类似秒杀)