分布式电商项目 谷粒商城 学习笔记<4>

文章目录

  • 十五、压力测试
    • 1.一些基本概念
    • 2.JVM内存机制
    • 3.压测记录
    • 4.Nginx动静分离
    • 5.优化三级分类查询
  • 十六、redisson分布式锁与缓存
    • 1.概念
    • 2.redis
    • 3.缓存失效
      • 缓存穿透
      • 缓存雪崩
      • 缓存击穿
        • 互斥锁:
    • 4.缓存击穿
          • 如何复制微服务:
    • 5.分布式缓存
      • 概念
      • 原则
      • 基本流程
    • 6.Redisson
      • 环境搭建
      • 可重入锁
        • 锁的续期
      • 读写锁
      • 信号量(Semaphore)
      • 闭锁
    • 7.缓存和数据库一致性

十五、压力测试

这里是使用jmeter作为压力测试工具。

1.一些基本概念

TPS 每秒处理的交易数

QPS 每秒处理的请求数

还有一个90%响应时间,也就是说,我们要尽量满足90%的请求都顺利完成,那么这个接口就很不错了。

从外部来看就是吞吐量越大越好,响应时间越短越好,错误率越低越好

SQL耗时越小越好,一般情况下微秒级别

命中率越高越好,一般情况下不能低于95%

锁等待次数越低越好,等待时间越短越好

中间件越多,性能损失越大,大多都损失在网络交互了

2.JVM内存机制

视频里涉及到了,原版笔记里有详细的jvm笔记,这里就不去深究。

https://blog.csdn.net/hancoder/article/details/107612746

大致是JVM分堆与栈,堆是线程共享的,栈是线程隔离的。

然后垃圾回收,主要是针对堆,因为堆是线程共享。

分youngGC和fullGC,当eden区满了又有新对象生成时,就youngGC,当youngGC之后eden区还是满的,就尝试放到老年区。当老年区满了,就fullGC,fullGC耗时是youngGC的十倍,所以JVM调优要尽量避免fullGC、fullGC再没空间就oom异常。

3.压测记录

主要包括

压测内容、压测线程数、吞吐量、90响应时间、99响应时间

4.Nginx动静分离

由于动态资源和静态资源都位于服务器中,导致服务器的压力过大。

而静态资源本身是不需要服务器处理的(大多是时候是不变的)

所以关于静态资源的请求我们并不需要放到服务器去做、也就是nginx收到静态资源的请求,其实并不需要转发到服务器网关。

具体步骤:

  1. 静态文件上传到 mydata/nginx/html/static/index/css

  2. 修改index.html的静态资源路径,加上static前缀src=“/static/index/img/img_09.png”

  3. 修改/mydata/nginx/conf/conf.d/gulimall.conf

  4. 如果遇到有/static为前缀的请求,转发至html文件夹

gulimall.conf

location /static {
   
        root   /usr/share/nginx/html;  #遇到/static 路径的请求,直接去本地linux目录寻找
    }


    location / {
   
        proxy_pass http://gulimall;  #  遇到除/static 路径意外的请求,路由至http://gulimall 并重新加上请求头	
        proxy_set_header Host $host;  #  (因为nginx转发会丢失消息头)
    }

5.优化三级分类查询

原本是每次获取子类pid,再去查子类。现在是一次性把所有的三级分类都查出来,封装成一个集合,再给他们分别包装。

//优化业务逻辑,仅查询一次数据库
List<CategoryEntity> categoryEntities = this.list();
//查出所有一级分类
List<CategoryEntity> level1Categories = getCategoryByParentCid(categoryEntities, 0L);
Map<String, List<Catalog2Vo>> listMap = level1Categories.stream().collect(Collectors.toMap(k->k.getCatId().toString(), v -> {
   
    //遍历查找出二级分类
    List<CategoryEntity> level2Categories = getCategoryByParentCid(categoryEntities, v.getCatId());
    List<Catalog2Vo> catalog2Vos=null

你可能感兴趣的:(SpringBoot,分布式,java,开发语言,阿里,压力测试)