秒杀项目笔记

.在这里插入图片描述

数据库设计建立

  1. 密码与用户信息分开存放

Bug

数据库时区问题

Unknown system variable ‘query_cache_size’

mysql-connecter-java的版本过低,很显然是数据库驱动程序与数据库版本不对应

Mybatis项目启动时报错:The server time zone value ‘�й���׼ʱ��’ is unrecognize

原因是使用了Mysql Connector/J 6.x以上的版本,然后就报了时区的错误,解决方法:
在配置url的时候不能简单写成 :
jdbc:mysql://localhost:3306/mybatis
而是要写成 :
jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC

项目结构示意图

在这里插入图片描述

在这里插入图片描述

默认内嵌tomcat配置

在这里插入图片描述
在这里插入图片描述

调优步骤

未优化

在这里插入图片描述

修改内置tomcat配置

在这里插入图片描述

MySql数据库QPS容量问题

在这里插入图片描述

MySql数据库TPS容量问题

在这里插入图片描述

nginx反向代理

未优化前:单机容量

在这里插入图片描述
在这里插入图片描述

改进后:多台虚拟机

动静分离
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

静态资源

ngnix 配置设置
在这里插入图片描述
将地址栏中的/resources/ 替换为/usr/local/openresty/nginx/html/resources/
在这里插入图片描述

动态反向代理

设置upstream server

    upstream backend_server{
        server 47.107.149.48 weight=1;
        server 120.25.202.247 weight=1;
        keepalive 30;                           长连接时间
}

weight 表示权重

除开resources,其余均作为动态请求处理

proxy_pass http://backend_server;   动态请求反向代理到backend_server
proxy_set_header Host $http_host:$proxy_port; 域名+端口
proxy_set_header X-Real-IP $remote_addr; 真正的ip地址是远端服务器的ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这个头尾nginx转发代理请求
proxy_http_version 1.1;             http1.1才支持长连接
proxy_set_header Connection "";     Connection为空, 使长连接开启 ,若不适用keepAlive,则Connection "false"

proxy_pass http://backend_server; 动态请求反向代理到backend_server
$http_host:$proxy_port 域名+端口

nginx优化后

在这里插入图片描述
数据库服务器cpu消耗减少,可以加大压力

nginx高性能的原因

epoll 多路复用

非阻塞IO操作

  1. java bio模型,阻塞进程式
    在这里插入图片描述
  2. linux select模型,变更触发轮训查找,有1024数量上限
    在这里插入图片描述
  3. epoll模型,变更触发回调直接读取,理论上无上限
    在这里插入图片描述
master worker 进程模型

平滑重启,平滑加载配置,不会断开用户连接
在这里插入图片描述
一个 master,多个 worker,master 管理 worker,worker 处理请求,且 worker 进程为单线程

  • master 进程用来管理 worker 进程
    包含:
    • 接收来自外界的信号,向各 worker 进程发送信号
    • 监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程
  • worker进程用来处理基本的网络事件
    • 多个 worker 进程间同等竞争来自客户端的请求,各进程间相互独立
    • 一个请求,只能在一个 worker 进程中处理,一个 worker 进程,不能处理其它进程的请求
    • worker 进程的个数一般与机器 cpu 核数一致
      原因: 与 Nginx 的进程模型以及事件处理模型有关
协程机制

将每个用户的请求对应到线程中的某一个协程,然后在协程中,依靠 epoll 多路复用机制来完成同步调用开发
Lua 脚本也是基于协程机制

  • 进程的出现是为了更好的利用CPU资源使到并发成为可能
  • 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能
  • 协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈

会话管理

基于cookie

基于cookie传输sessionid :java Tomcat 容器session实现

基于token(移动端会禁止cookie)

基于token传输sessionid :java 代码session实现迁移到redis

缓存

缓存设计

在这里插入图片描述

多级缓存

在这里插入图片描述

redis缓存

单机版
在这里插入图片描述
哨兵模式
在这里插入图片描述
在这里插入图片描述

集群cluster模式
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Redis集中式缓存商品详情页

在这里插入图片描述

本地热点缓存(jvm内存)

redis的存与取都需要通过网络io , 对性能有部分影响
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

nginx proxy cache缓存实现

在这里插入图片描述

依靠文件系统存索引级的文件:性能下降

在这里插入图片描述

依靠内存缓存文件地址nginx lua

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
shared dic
在这里插入图片描述
openresty redis 支持
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

静态资源优化

在这里插入图片描述
在这里插入图片描述

缓存库存

在这里插入图片描述

在这里插入图片描述

交易验证优化

在这里插入图片描述

库存扣减行锁优化

  1. 设定索引
  2. 扣减库存缓存化
    在这里插入图片描述
  3. 异步同步数据库
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 库存数据库最终一致性保证
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

秒杀削峰

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

防刷限流

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

令牌桶

限制速度最大值
在这里插入图片描述

漏桶

限制速度,平滑流量
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

服务器2

xyy:
公网ip 120.25.202.247
私网ip 172.18.154.217
vpc-wz9sk1qvkvivfuy8k88w7
1378290721378404

zsb:
112.74.172.117
172.18.117.51
1300590740760986
sg-wz9awjm6q5kmfiyubq59

企业云:
cen-q7ia2ex9kzg6th238l
1486288179337179
sg-wz9anyt65ach969xmsnn

cdq
1336590720791339
47.107.149.48
172.18.97.155

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值