常见的缓存问题以及解决方案:
当系统处于高峰期的时候,业务流量剧增,给系统带来了很大的压力,严重情况下可能导致系统宕机。
我们一般都会使用 异步/限流/缓存 等措施来减轻DB的 压力。其中每种措施都有复杂的使用场景以及措施。 而其中 缓存我们使用的就有很多,例如缓存 个人主页圈子列表第一页,等一些不太易变的数据。
在使用缓存系统的时候,当遇到大并发的情况下,经常会遇到较多的问题,以下总结一下常见的问题及解决方案。
1. 缓存穿透:
在使用缓存的时候,一般是先去缓存中查询,如果没有值,那么就去数据库取,如果数据库也没有,那么就根据业务需求,抛出异常,或者返回空。
那么就会存在这种情况,如果用户一直在访问一个数据库中不存在的数据,例如 id = -1, 就会导致每次请求都会先去缓存中查询,然后再去数据裤查一次,如果这种请求多的话,就会造成严重的性能问题,这种请求就是缓存穿透。
解决方案:
- 对于请求参数做校验, 用户鉴权,查询条件做 基础逻辑校验,例如 ID > 0, name != “” 等等。 在业务逻辑层 就去规避 数据库层的无效查询。
- 如果在数据库中,根据指定条件没有查询到值,那么可以将对应的字段存储到缓存中去, value 为 null(设置短暂的过期时间,防止后续插入之后仍然查询不到数据),在最近的时间内其他的请求就会直接返回未查到的结果。