Redis 之缓存穿透的解决方案

阅读时长 5 分钟读完

在前端开发中,缓存可以大大加速页面的访问速度,提高用户的体验。但是,当缓存被攻击者恶意攻击时,就会出现缓存穿透的问题。缓存穿透会导致大量请求落到数据库上,影响系统的性能。本文将介绍缓存穿透的解决方案,为前端开发者提供指导意义。

什么是缓存穿透?

缓存穿透是指恶意攻击者以一种访问数据库不存在的数据为入口,让大量请求直接穿透缓存层,直接请求到数据库中,导致数据库资源极度消耗。常见攻击方式包括:

  • 输入不存在的值;
  • 使用明显的 SQL 注入字符;
  • 使用特殊字符绕过检查。

缓存穿透的危害

缓存穿透可能带来以下危害:

  • 消耗数据库资源,导致数据库崩溃;
  • 阻塞正常的请求,导致系统不可用;
  • 暴露数据,可能被恶意攻击者利用。

如何避免缓存穿透?

1. 记录空对象

在应用程序中添加对缓存不存在的对象进行记录,这种方法常常被称为 缓存雪崩。这种方法可以在应用程序中路由请求,并防止缓存层中没有这个对象。缓存雪崩通过记录空值来缓解崩溃之前的负载。下面是示例代码:

-- -------------------- ---- -------
----- -------- ------------------- -
  ----- --------- - ----- ----------------------------
  -- ----------- -
    ------ ----------------------
  -

  ----- ---------- - ----- ----------------------
  -- ------------- -
    -- ------------
    ----- --------------------------- ------------------- ----- ----
    ------ -----
  -

  ----- --------------------------- --------------------------- ----- ----
  ------ -----------
-

2. 布隆过滤器

布隆过滤器是对缓存不存在的值进行处理的工具。因为布隆过滤器本质上是一个判断元素是否存在于一个集合中的可伸缩、可插入、无法删除的数据结构。在缓存层中使用布隆过滤器,可以将缓存不存在的值与在数据库中不存在的值区分开来,从而防止缓存穿透。

-- -------------------- ---- -------
----- - ----------- - - -------------------------
----- ----- - -----------------

----- ----------- - ---------------------

----- ------ - --- -------------------- ---

----- -------- ------------------- -
  ----- --------- - ----- ----------------------------
  -- ----------- -
    ------ ----------------------
  -

  -- ---------
  -- -------------------- -
    ------ -----
  -

  ----- ---------- - ----- ----------------------
  -- ------------- -
    -------------------
    -- ------------
    ----- --------------------------- ------------------- ----- ----
    ------ -----
  -

  ----- --------------------------- --------------------------- ----- ----
  ------ -----------
-

3. 限制缓存的过期时间

将缓存数据的过期时间限制到较少的时间范围,减小数据库中数据的压力。在设置缓存时,可以将数据的过期时间随机分布在一定时间范围内,从而每个缓存的过期时间不会同时到期,如下所示:

-- -------------------- ---- -------
-------- --------------------- -
  ------ ------------------------ - --- - ---
-

----- -------- ------------------- -
  ----- --------- - ----- ----------------------------
  -- ----------- -
    ------ ----------------------
  -

  ----- ---------- - ----- ----------------------
  -- ------------- -
    -- ------------
    ----- --------------------------- ------------------- ----- -----------------------
    ------ -----
  -

  ----- --------------------------- --------------------------- ----- -----------------------
  ------ -----------
-

总结

缓存穿透是一种常见的攻击方式,容易影响服务器的性能和数据的安全性。我们可以通过使用缓存雪崩、布隆过滤器、限制缓存的过期时间等方式来避免缓存穿透。通过以上的方案,可以更好地保证系统的安全性和正常运行。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64655cb8968c7c53b0610711

纠错
反馈