写点什么

2023-06-25:redis 中什么是缓存穿透?该如何解决?

  • 2023-06-25
    北京
  • 本文字数:886 字

    阅读完需:约 3 分钟

2023-06-25:redis 中什么是缓存穿透?该如何解决?


答案 2023-06-25:


缓存穿透


缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存穿透问题的解决对于维护系统性能和资源利用至关重要。


造成缓存穿透的基本原因有两个。


缓存穿透的主要原因有两个。


首先,可能是由于业务代码或数据本身出现问题。例如,如果数据库中的 ID 从 1 开始自增,而某些请求携带了不存在的 ID 值(比如负数或特别大的值),如果对参数不进行校验,这些请求将会绕过缓存直接访问数据库。由于数据库中也查不到对应的数据,每个请求都会以相同的方式处理,这样会给数据库带来很大压力,尤其是在高并发的情况下,容易导致系统崩溃。


其次,缓存穿透也可能由恶意攻击、爬虫等行为造成,这些请求大量命中缓存但数据却不存在,导致每个请求都需要访问存储层。这种情况下,攻击者可以通过大量的无意义请求消耗系统资源,从而影响系统的正常运行。



如何解决


1.缓存空对象


当存储层不命中时,即使在数据库中也没有找到命中的数据,仍然将空对象保存到缓存层中。这样,下次对该数据的访问将从缓存中获取,从而保护了后端数据源的访问。然而,需要注意的是如果频繁存储空值,会导致缓存层占用更多的内存空间,尤其在面对攻击时问题更为严重。因此,可以为这类数据设置较短的过期时间,以使其能够自动被清理出缓存。


2.布隆过滤器拦截


在访问缓存层和存储层之前,使用布隆过滤器提前保存已存在的键,并进行第一层拦截。例如,对于一个推荐系统,存在 4 亿个用户 ID,每个小时根据用户的历史行为计算并存储推荐数据。然而,对于最新的用户由于没有历史行为,可能发生缓存穿透。为此,可以将所有推荐数据的用户 ID 构建成布隆过滤器。如果布隆过滤器认为某个用户 ID 不存在,就不会进一步访问存储层,从而在一定程度上保护了存储层。



这些方法适用于数据命中率不高、数据相对稳定、实时性要求较低(通常是数据集较大)的应用场景。尽管实施这些方法可能会增加代码的维护复杂性,但能有效减少缓存空间的占用。

发布于: 刚刚阅读数: 3
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
2023-06-25:redis中什么是缓存穿透?该如何解决?_redis_福大大架构师每日一题_InfoQ写作社区