开发自我修养之路
代码开发
1、不要把服务器路径返回给前端
2、数据请求参数在后端作一定的校验,记住前端是不可靠的
3、sql最后务必按时间和主键order by,防止分页出现数据重复的问题
4、限制查询条数,提前过滤掉不当请求
后端调用接口
try {
Req req = new Req();
req.setId(Id);
log.info("调用接口, Id: {}", Id);
String repsonse = HttpTemplates.create()
.headers(getRequestHeader())
.url(url)
.body(JsonUtils.toJsonString(req))
.post();
ResponseMsg responseMsg = new ObjectMapper().readValue(repsonse, TypeFactory.defaultInstance().constructType(new TypeReference>() {}));
if (!CODE_SUCCESS.equals(responseMsg.getCode())) {
throw new AppException(MessageFormat.format("调用接口失败, Id: {}", Id));
}
String price = responseMsg.getData();
log.info("调用接口结束, Id: {}", Id);
} catch (Exception e) {
log.error("调用接口失败", e);
}
缓存处理
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
一、缓存穿透
大量并发请求缓存和数据库中都没有的数据。
二、缓存击穿
大量并发请求同一条数据,但该数据缓存中没有但数据库中有。
三、缓存雪崩
大量并发请求不同数据,这些数据缓存中没有但数据库中有。
四、解决方案
1、Controller层增加校验,如用户鉴权校验,id基础校验 。
2、设置热点数据永远不过期。
3、对数据加互斥锁,保证其中一个请求去数据库中取数据时,其他线程等待,最后从缓存中取数据。
4、缓存数据的过期时间设置随机。
5、热点数据均匀分布在不同的数据库中。