项目的难点

一个单线程web应用,没有spirng对内部的一个调优,且数据库版本较低,当并发数到达一定量的时候,经常会造成线程阻塞的情况

  • 项目代码4 — 数据库2 — jvm1 — 操作系统0
  • 在脱离框架后是否可以使用原生技术解决问题—使用HttpUrlConnection来获取IO流,根据流在获取文件(MultipartFile)
  • 设计模式重构,部分请求在通过并发的方式处理,修改代码减少for循环次数,适度跳出
  • 流程页面使用页面静态化提高用户访问速度
  • 将模块抽离,使用spring构建新模块,采取前后端分离的方式
  • 排除sql语句是否使用了索引(定位慢sql),数据库是否建立了合适的索引
  • 用缓存来减少数据库的压力 用缓存来减少数据库的压力
  • 调整jvm堆内存大小

如何设计一个秒杀系统

秒杀系统就是一个“三高”系统,即高并发、高性能和高可用的分布式系统
秒杀设计原则:前台请求尽量少,后台数据尽量少,调用链路尽量短,尽量不要有单点
秒杀高并发方法:访问拦截、分流、动静分离
秒杀数据方法:减库存策略、热点、异步、限流降级
访问拦截主要思路:通过CDN和缓存技术,尽量把访问拦截在离用户更近的层,尽可能地过滤掉无效请求。
分流主要思路:通过分布式集群技术,多台机器处理,提高并发能力。

需求案例

  • 同时搜索出各个品牌数据银行与策略中心的人群包信息
    节省性能代码(可用作项目)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Example {
    public static void main(String[] args) {
    // 获取开始时间
    long startTime = System.currentTimeMillis();
    List<A> ls = new ArrayList<>();
    ls.add(new A("tom","10", "a"));
    ls.add(new A("jack","20", "b"));
    ls.add(new A("tom","10", "c"));
    // // 程序运行时间取决于核数
    // List<String> collect = getList(ls);
    // 传统方式
    List<String> collect = ls.stream().map(a -> a.cal() + 2).collect(Collectors.toList());
    System.out.println(collect);
    //获取结束时间
    long endTime = System.currentTimeMill7is();

    System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
    }

    private static List<String> getList(List<A> ls) {
    return ls
    .stream()
    .map(a -> CompletableFuture.supplyAsync(() -> a.cal() + 2))
    .collect(Collectors.toList())
    .stream()
    .map(CompletableFuture::join)
    .collect(Collectors.toList());
    }

    }
    @Data
    class A {
    String name;
    String age;
    String address;
    public A(String name, String age, String address) {
    this.age = age;
    this.name = name;
    this.address = address;
    }
    String cal() {
    try {
    ThreadUtil.sleep(1, TimeUnit.SECONDS);
    } catch (Exception ignored) {

    }
    return this.age + "1";
    }
    }
    GTA是GMV到AIPL的缩写。指GMV销量,用于反向计算AIPL各环节的人的需求。反向标准是根据过去新客户和老客户的销售比例计算出A、I、P、L的需求体量,再根据不同环节的人群转化率计算出相应的需求人口体量。目的是让品牌在营销上的投入更有针对性。

项目中用到Redis了吗

月报跑数据完成之后需要给客户发数据,实时数据会使用Redis,离线的用Hive,一般来说使用Set,List,和Hash结构。
发消息会用到模板,每个模板都会有一个独一的id(时间+业务参数),如果要看某天下发的模板,只需要将模板id放入Set中去。
看模板的整体链路情况,那么可以用Hash,key位状态,value为人数
看某个用户下发的信息,用List即可,使用Redis的数据结构来实现消息的多个维度的统计

jwt的优缺点

优点:通用跨语言
2. 占用小,便于传输
3. 服务端无需保存会话信息,容易水平拓展
4. 一处生成,到处使用,可用于分布式系统,解决单点登录的问题

缺点
安全性,使用https防止token被劫持
双向解码,不要存储敏感信息