电商中常见的高并发解决方案

article/2025/9/20 10:43:21

目录

多级缓存

什么叫多级缓存

多级缓存的实现思路

Redis 缓存同步 MySql 数据

Nginx 限流

什么是限流

常见的限流算法之漏桶算法

nginx 限流的方式

控制速率

控制并发量(连接数)


在本文中,我们将以京东为例,了解电商中常见的高并发解决方案

多级缓存

我们以京东首页为例 

在上图中,我们可以看出商品的分类是较少发生变化的,这时我们可以把它存储到缓存中,这样数据库的压力会大大减少。这时我们会想到 redis 进行缓存,但是有时电商网站的并发数仅仅靠 redis 会使用 redis 压力过大,这时我们在此引出一个概念:多级缓存。

什么叫多级缓存

为了解决上文中的那个问题,我们在 redis 的基础上再添加一个 nginx 缓存,此时用户在访问我们网站时会先访问 nginx 缓存,如果 nginx 缓存没有,再访问 redis 缓存,如果 redis 也没有,此时我们最后访问 MySQL 获取数据,这样一来,我们将 redis 的压力大大减轻了,此时 nginx 缓存和 redis 缓存就构成了多级缓存

多级缓存的实现思路

那么我们如何实现上面所说多级缓存呢?

我们可以使用 OpenResty 这一基于 Nginx 与 Lua 的高性能 Web 平台,该平台整合了 Nginx 和大量精良的 Lua 库、第三方模块以及大多数的依赖项。Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。关于 OpenResty 和 Lua,我们在本文不多过多涉及,这里只提供实现思路,有兴趣的可以访问 OpenResty 官网(http://openresty.org/cn/)和 Lua 官网(http://www.lua.org/)进行学习。在实际操作中,我们通常使用 Lua 脚本去访问 Nginx 缓存、Redis 缓存以及 MySQL,过程如下图:

 但是在上面的过程中,我们会发现一个问题,在 Redis 缓存已存在的情况下,数据库的数据发生了改变,这时用户访问的都是缓存数据,那我们要如何解决这一问题呢?

Redis 缓存同步 MySql 数据

我们可以通过 canal 解决上面的问题。canal 是一个用来监控数据库数据的变化的工具,可以在Mysql 数据更新时获取其更新的数据。

解决思路:在 Mysql 数据变化时,我们可以通过 canal 微服务或配置MQ模式,配合 RocketMQ 或者 Kafka 来更改 Redis 中的缓存数据,这样 redis 缓存的数据就可以和 Mysql 中的数据保持一致了

关于 canal 的入门可以参考文章 超详细的Canal入门,看这篇就够了!_yehongzhi1994的博客-CSDN博客_canal​​​​​​

Nginx 限流

一般情况下,首页的并发量是比较大的,即使 有了多级缓存,当用户不停的刷新页面的时,或者有大量恶意的请求达到,也会对系统造成影响。这时我们就需要采用限流这一解决方案。

什么是限流

顾名思义,限流就是限制流量。例如你手机流量包只有1个G的流量,用完了就没了,这时候我们可以说我们的流量是受到限制,这就叫限流。

常见的限流算法之漏桶算法

算法思想是:

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶中(缓冲),以固定速率流出;
  • 水桶满后水溢出(丢弃)。

这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。 

nginx 限流的方式

控制速率

我们先来说第一种,控制速率。Nginx 控制速率主要使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

配置 OpenResty 中 Nginx 的配置文件,使在访问 ip/test1 地址时进行限流,该地址会访问一个 Lua 脚本

user root root;
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;#限流设置limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;location /test1{#使用限流配置limit_req zone=contentRateLimit;content_by_lua_file /root/lua/test1.lua;}}
}

配置说明:

binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, contentRateLimit:10m 表示一个大小为10M,名字为 contentRateLimit 的内存区域。1M能存储 16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

限流速度为每秒 10 次请求,如果有10次请求同时到达一个空闲的 nginx,他们都能得到执行吗?
事实上,漏桶漏出请求是匀速的。10r/s是怎样匀速的呢?每100ms漏出一个请求。在这样的配置下,桶是空的,所有不能实时漏出的请求,会被拒绝掉。所以如果10次请求同时到达,那么只有一个请求能够得到执行,其它的,都会被拒绝。这不太友好,大部分业务场景下我们希望这10个请求都能得到执行。

处理突发流量

上面这种情况我们管它叫做突发流量,上面例子限制 10r/s,如果有时正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合 burst 参数使用来解决该问题。

修改上文中的 Nginx 配置文件

server {listen 80;server_name localhost;location /test1 {limit_req zone=contentRateLimit burst=20 nodelay;content_by_lua_file /root/lua/test1.lua;}  
}

burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数,当 rate=10r/s 时,将1s拆成10份,即每100ms可处理1个请求。
此处,burst=12,若同时有12个请求到达,Nginx 会处理第一个请求,剩余11个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于12,将拒绝处理多余的请求,直接返回 503。

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处理时间自然难以接受。
因此,burst 往往结合 nodelay 一起使用。

继续修改上文中的 Nginx 配置文件

server {listen 80;server_name localhost;location /test1 {limit_req zone=contentRateLimit burst=20 nodelay;content_by_lua_file /root/lua/test1.lua;}  
}

平均每秒允许不超过10个请求,突发不超过20个请求,并且处理突发20个请求的时候,没有延迟,等到完成之后,按照正常的速率处理。
如上两种配置结合就达到了速率稳定,但突然流量也能正常处理的效果。

控制并发量(连接数)

nginx 还提供了利用连接数限制某一个用户的ip连接的数量来控制流量。一种是限制固定连接数,第二种是限制每个客户端IP与服务器的连接数,同时限制与服务器的连接总数。

注意:并非所有连接都被计算在内,只有当服务器正在处理请求并且已经读取了整个请求头时,才会计算有效连接。

配置限制固定连接数

http {include mime.types;default_type application/octet-stream;#限流设置limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;#根据IP地址来限制,存储内存大小10Mlimit_conn_zone $binary_remote_addr zone=addr:1m;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;location /test2 {limit_conn addr 2;content_by_lua_file /root/lua/test2.lua;}                                                        location /test1 {limit_req zone=contentRateLimit burst=20 nodelay;content_by_lua_file /root/lua/test1.lua;}    }
}

limit_conn_zone $binary_remote_addr zone=addr:10m; 表示限制根据用户的IP地址来显示,设置存储地址为的内存大小10M
limit_conn addr 2; 表示同一个地址只允许连接2次。

限制每个客户端IP与服务器的连接数,同时限制与服务器的连接总数

http {include mime.types;default_type application/octet-stream;#限流设置limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=10r/s;#存储个人请求IP的限流配置limit_conn_zone $binary_remote_addr zone=perip:10m;#整个location对应的请求并发容量配置limit_conn_zone $server_name zone=perserver:100m;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;location /test2 {limit_conn perip 10;#单个客户端ip与服务器的连接数"10"limit_conn perserver 100; #限制与服务器的总连接数"100"content_by_lua_file /root/lua/test2.lua;}                                                        location /test1 {limit_req zone=contentRateLimit burst=20 nodelay;content_by_lua_file /root/lua/test1.lua;}    }
}

http://chatgpt.dhexx.cn/article/KGL4MDDV.shtml

相关文章

【数据科学】斯皮尔曼的等级相关系数(Spearman's coefficient)

在统计数据中,斯皮尔曼的等级相关系数或斯皮尔曼的rho,以查尔斯斯皮尔曼命名并经常用希腊字母表示或,是秩相关的非参数度量(两个变量的排名之间的统计依赖性)。它评估了使用单调函数描述两个变量之间关系的程度。 两个…

python 利用Scipy计算person 和spearman相关系数

python 利用Scipy计算person 和spearman相关系数 觉得有用的话,欢迎一起讨论相互学习~ 学习以下两位大佬的讲解 (Pearson)皮尔逊相关系数和spearman相关系数(附python实现) 相关性系数及其python实现 皮尔逊相关系数 下面是皮尔逊相关系数的计算公式…

Python+pandas计算数据相关系数(person、Kendall、spearman)

pandas中DataFrame对象corr()方法的用法,该方法用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数、Kendall Tau相关系数和spearman秩相关)。 pandas相关系数-DataFrame.corr()参数详解 DataFrame.corr(methodpearson, min_p…

相关性Correlations 皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)

相关性Correlations Correlations,相关度量,目前Spark支持两种相关性系数:皮尔逊相关系数(pearson)和斯皮尔曼等级相关系数(spearman)。相关系数是用以反映变量之间相关关系密切程度的统计指标。…

spearman学习

特征提取,预测都弄完了,现在要检查一下预测的效果。 spearman秩相关系数是度量两个变量之间的统计相关性的指标,用来评估当用单调函数来描述两个变量之间的关系有多好。在没有重复数据的情况下,如果一个变量是另外一个变量的严格…

R语言中进行Spearman等级相关分析

摘要 使用Spearman等级相关性测试两个等级变量或一个等级变量和一个测量变量之间的关联。 如果您担心非正态性,也可以对两个测量变量使用Spearman等级相关性而不是线性回归/相关性,但这通常不是必须的。 宏伟的军舰鸟(军舰鸟magnificens&…

相关系数pearson、spearman、kendall和R语言中的cor/or.test()

相关系数pearson、spearman、kendall和R语言中的cor/cor.test 1. 相关系数pearson、spearman、kendall2. R语言cor函数和cor.test函数 1. 相关系数pearson、spearman、kendall Pearson相关系数很简单,是用来衡量两个数据集的线性相关程度;而Spearman相关…

皮尔逊(Pearson)相关系数与spearman相关系数(Python实现)

概念介绍 相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度。 相关系数大小解释 相关性绝对值无相关0 - 0.09弱相关0.1 - 0.3中相关0.3 - 0.5强相关0.5 - 1 表中所定的标准从某种意义上说是武断的和不严格的。 对相关系数的解…

3.1 相关系数(person与spearman)

1.1总体皮尔逊(person)相关系数: 在概率论与数理统计中我们学到,若两组数据X{x1,x2…xn}与Y{y1,y2…yn}为总体数据,则总体协方差为 它表示两个变量的总体误差,若XY相对于各自均值同…

斯皮尔曼相关(spearman)系数法

在分析指标与指标、指标与研究对象的影响程度时,很多时候会用到相关系数法,下面介绍一下斯皮尔曼相关系数法。 斯皮尔曼等级相关是根据等级资料研究两个变量间相关关系的方法。它是依据两列成对等级的各对等级数之差来进行计算的,斯皮尔曼等级…

Spearman 相关性分析法,以及python的完整代码应用

Spearman 相关性分析法 简介 Spearman 相关性分析法是一种针对两个变量之间非线性关系的相关性计算方法,同时,它不对数据的分布进行假设。该方法的基本思想是将两个(也可以多个)变量的值进行排序,并计算它们之间的等…

统计学三大相关系数之斯皮尔曼(spearman)相关系数

斯皮尔曼相关性系数,通常也叫斯皮尔曼秩相关系数。“秩”,可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解,这种表征形式就没有了求皮尔森相关性系数时那些限制。下面来看一下它的计算公式:…

相关系数(皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数)

目录 总体皮尔逊Person相关系数: 样本皮尔逊Person相关系数: 两点总结: 假设检验:(可结合概率论课本假设检验部分) 皮尔逊相关系数假设检验: 更好的方法:p值判断方法 皮尔逊相…

三大统计学相关系数(pearson、kendall、spearman)

一、皮尔逊相关系数 前边文章讲了很多了,这里不详细讲了,想了解的可以看这篇。 相似度计算(2)——皮尔逊相关系数 适用范围: 当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适…

Pearson相关系数和Spearman相关系数的区别

Pearson相关系数和Spearman相关系数的区别 1、协方差、相关系数2、Pearson相关系数3、Spearman相关系数3.1 定义3.2 什么时候用 4、两者的区别点4.1 线性相关与单调相关4.2 前提假设不同4.3 变量正态分布与否 5、实例展示6、参考资料 参考资料前两个博客讲解的非常详细&#xf…

Pearson相关系数, Spearman相关系数,Kendall相关系数

三个相关性系数(pearson, spearman, kendall)反应的都是两个变量之间变化趋势的方向以及程度,其值范围为-1到1,0表示两个变量不相关,正值表示正相关,负值表示负相关,值越大表示相关性越强。 1.…

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

目录 前言 一、基本概念及二者适用范围比较 1、什么是相关性分析 2、什么是相关系数 3、适用范围比较 二、相关系数 1.皮尔逊相关系数(Pearson correlation) 1、线性检验 2、正态检验 3、求相关系数 2、斯皮尔曼相关系数(Spearman…

斯皮尔曼相关(Spearman correlation)系数概述及其计算例

目录 1. 什么是秩相关系数? 2. 单调性,monotonicity 3. 斯皮尔曼秩相关系数 4. 什么时候使用斯皮尔曼秩相关系数呢? 5. 斯皮尔曼秩相关系数计算公式 6. 斯皮尔曼秩相关系数计算例 6.1 手动计算 6.2 scipy函数 6.3 pandas corr() 6…

一文数学数模-相关性分析(二)斯皮尔曼相关(spearman)相关性分析一文详解+python实例代码

前言 相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性系数就有三种:person相关系数,spearman相关系数,Kendalls tau-b等级相关系数。各有各自的用法和使用场景。当然关于这以…

斯皮尔曼(spearman)相关系数python代码实现

简介 斯皮尔曼等级相关系数(简称等级相关系数,或称秩相关系数,英语:Spearmans rank correlation coefficient或Spearmans ρ)。一般用或者表示。它是衡量两个变量的相关性的无母数指标。它利用单调函数评价两个统计变量…