开发自我修养之路


代码开发

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、热点数据均匀分布在不同的数据库中。