一问一答之项目
项目的难点
一个单线程web应用,没有spirng对内部的一个调优,且数据库版本较低,当并发数到达一定量的时候,经常会造成线程阻塞的情况
- 项目代码4 — 数据库2 — jvm1 — 操作系统0
- 在脱离框架后是否可以使用原生技术解决问题—使用HttpUrlConnection来获取IO流,根据流在获取文件(MultipartFile)
- 设计模式重构,部分请求在通过并发的方式处理,修改代码减少for循环次数,适度跳出
- 流程页面使用页面静态化提高用户访问速度
- 将模块抽离,使用spring构建新模块,采取前后端分离的方式
- 排除sql语句是否使用了索引(定位慢sql),数据库是否建立了合适的索引
- 用缓存来减少数据库的压力 用缓存来减少数据库的压力
- 调整jvm堆内存大小
如何设计一个秒杀系统
秒杀系统就是一个“三高”系统,即高并发、高性能和高可用的分布式系统
秒杀设计原则:前台请求尽量少,后台数据尽量少,调用链路尽量短,尽量不要有单点
秒杀高并发方法:访问拦截、分流、动静分离
秒杀数据方法:减库存策略、热点、异步、限流降级
访问拦截主要思路:通过CDN和缓存技术,尽量把访问拦截在离用户更近的层,尽可能地过滤掉无效请求。
分流主要思路:通过分布式集群技术,多台机器处理,提高并发能力。
需求案例
- 同时搜索出各个品牌数据银行与策略中心的人群包信息
节省性能代码(可用作项目)GTA是GMV到AIPL的缩写。指GMV销量,用于反向计算AIPL各环节的人的需求。反向标准是根据过去新客户和老客户的销售比例计算出A、I、P、L的需求体量,再根据不同环节的人群转化率计算出相应的需求人口体量。目的是让品牌在营销上的投入更有针对性。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
49public 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());
}
}
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";
}
}
项目中用到Redis了吗
月报跑数据完成之后需要给客户发数据,实时数据会使用Redis,离线的用Hive,一般来说使用Set,List,和Hash结构。
发消息会用到模板,每个模板都会有一个独一的id(时间+业务参数),如果要看某天下发的模板,只需要将模板id放入Set中去。
看模板的整体链路情况,那么可以用Hash,key位状态,value为人数
看某个用户下发的信息,用List即可,使用Redis的数据结构来实现消息的多个维度的统计
门店
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 柠檬大师的空间站!
评论