电商秒杀系统应对高并发相关的技术

在电商秒杀系统中,短时间内应对大量请求,造成高并发。这样,程序应该尽可能的过滤掉无效的请求,然后对于有效请求,使用各种技术进行处理。

 

1. 对网页中的图片或者不经常改动的其他静态资源进行浏览器端的缓存。

   电商秒杀系统应对高并发相关的技术

 

       电商秒杀系统应对高并发相关的技术

 

Cache-Control  no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处)

Pragma 当"no-cache"出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已经在上次请求时已经缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新。

cache-control

响应头中的 Cache-Control:max-age=315360000 是通知浏览器:315360000 秒之内不要烦我,自己从缓冲区中刷新。在这个文件第一次从服务器加载到本地之后,随时时间的增长,其里过期时间会越来越短。如果过期了,会向服务器发送no-cache得到新版本的文件,然后缓存到本地。这是纯粹的本地缓存方式,不涉及去服务器端查询文件最新修改时间。

 

如果使用询问服务器最新文件修改时间的方式,首先在Cache-Control中设置no-cache,同时遵从实际情况我们把max-age设置为0

no-cache并不意味着不缓存。它的意思是在使用缓存资源之前,它必须经过服务器的检查(revalidate也可以实现这个功能)。

max-age>0 时直接从游览器缓存中提取

max-age<=0 时向server 发送http 请求确认 ,该资源是否有修改。有的话返回200 ,无的话返回304.

电商秒杀系统应对高并发相关的技术

 

同时,服务器端也要配合着做一些代码上的验证。

电商秒杀系统应对高并发相关的技术

Spirng中加入了对可缓存资源的管理。但是这里只是实现了本地资源的缓存,也就是纯粹的本地缓存方式,并没有实现服务器文件修改时间问询的方式

电商秒杀系统应对高并发相关的技术

 

Ctrl+F5刷新页面的话,会忽略所有的缓存命令,直接从服务区端拉取最新的文件。Chrome浏览器的Disable cache命令作用等同于Ctrl+F5

电商秒杀系统应对高并发相关的技术

 

 

2. 服务器端的进程内缓存。处理web服务器自带的session缓存,我们自己也可以写一些全局的线程安全的静态类,用来存储缓存文件。比如ConcurrentHashMap等。

另外也有很多成熟的第三方类可以使用。GuavaCache是谷歌出品的一款缓存类。GuavaCache是线程安全的,所以可以做成单例模式。

电商秒杀系统应对高并发相关的技术

 

电商秒杀系统应对高并发相关的技术

以上都是堆内缓存,即在JVM中开辟出一块空间存储一个对象,然后在这个对象中存储缓存信息。还有一种进程内的缓存,是存在堆外的。MapDB是堆外缓存。

电商秒杀系统应对高并发相关的技术

 

电商秒杀系统应对高并发相关的技术

 

3. 服务器端的进程外缓存,比如Redis. 用于缓存商品信息等。

4. 在秒杀场景中,事先将商品数量放到Redis缓存中,每一个请求如果能够顺利通过redis缓存,才能达到数据库端进行操作,因为数据库端的连接数量是非常宝贵的,一般也就1000左右,多了就开始抛出异常,影响性能。然后在数据库端进行减库存操作的时候,为了防止超卖,也要加入一个大于0的判断。

先在product.getStock()处判断是否库存大于0,此时还大于0的话,则进行下订单减库存。然后在修改的时候,还是要再一次进行库存的判断。

update t_product t set t.amount=t.amount-1 where t.product_name='xxx' and t.amount>0;

其实这也类似于一个乐观锁的version字段,先去把数据拿出来修改,改完了之后存储的时候判断一下version字段,看看有没有被修改。这里存储的时候判断的是amount字段。

电商秒杀系统应对高并发相关的技术

 

电商秒杀系统应对高并发相关的技术

Redis的引入,增加了系统的吞吐量,因为避免了太多的请求直接使用数据库,使短时间内能够处理大量的请求。

上述代码存在问题,如果Redis端每次都减少的话,会达到-100,这时候如果有人退单了,本来商品库存应该加1,但是加完之后-99还是小于0.所以我们在库存不足的情况下,需要再把减掉的值加回去。

电商秒杀系统应对高并发相关的技术

从JVM到Redis有网络流量,为了更进一步减少网络流量,我们可以这样改进。

电商秒杀系统应对高并发相关的技术

 

电商秒杀系统应对高并发相关的技术

 

电商秒杀系统应对高并发相关的技术