Redis 缓存穿透的解决技巧与实践

Redis 是一种快速且高效的缓存工具,在很多 Web 应用程序中都被广泛使用。但是,在实现 Redis 缓存时,我们可能会遇到一些问题,例如缓存穿透。

缓存穿透是指当一个请求查询一个缓存中不存在的数据时,由于缓存未能返回结果,该请求将直接传递给数据库层。如果该请求由于某种原因持续发生,将大大降低服务器的性能,因为它会对数据库进行大量的查询,而数据库很可能无法承受这种负载。

本篇文章将介绍 Redis 缓存穿透的解决技巧和实践,以及如何实现这些技巧和跟踪缺少的数据,从而使 Redis 缓存更加高效和优秀。

Redis 缓存穿透的解决技巧

布隆过滤器

布隆过滤器是一种旨在帮助我们快速透视缓存中是否存在指定数据的算法。在缓存中打开布隆过滤器时,缓存会先将所有的键存储在这个布隆过滤器中。当一个新的缓存查询到来时,Redis 首先看一下布隆过滤器,看看它是否已经常常该请求。如果是,Redis 将返回一个虚假的结果,告诉请求者它不存在于缓存中。如果不是,将继续执行查询并将结果存储在缓存中。

这种技巧的优点是快速、有效,且不会影响正常的缓存查询,缺点是有一定误报率,即有可能将存在于缓存中的数据错误地报为缓存外的数据。但是我们可以通过调整布隆过滤器的大小和 hash 函数的数量,来调整误报率。所以布隆过滤器是一种非常高效的解决 Redis 缓存穿透的技巧。

下面是使用 Python 实现布隆过滤器的示例代码:

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


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

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

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

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

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

        ------ ----

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

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

预处理

在遭受缓存穿透攻击时,可以考虑在 Redis 缓存中用一些随机的、程序生成的“填充值”占用缓存中的一些键。例如,我们可以用类似于以下示例代码来预填充需要缓存的数据:

------ -----


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

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

    ------ ----

在这个示例代码中,我们为 Redis 缓存中不存在的所有键占用了“#Na”值,这样它们就会被视为缓存中的数据,不会再次进行数据库查询。

缓存雪崩

缓存雪崩是指在某一特定时间段缓存服务器中有大量的数据过期或者某个组件宕机,导致一些数据没有缓存到内存中。解决这个问题最简单的方式就是,增加缓存层的冗余度,将数据分散到不同的缓存服务器上。这种方式不仅可以防止缓存雪崩,还可以提高可扩展性、可循环性和可维护性。

Redis 缓存穿透的实践

下面是一个 Python 示例,用于演示如何使用 Redis 做缓存和布隆过滤器存储,以避免缓存穿透的问题:

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


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

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

    ------ -----


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

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

    ------ ----


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

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

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


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

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

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

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

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

        ------ ----

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

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


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

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

        ------ ----

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

总结

Redis 缓存穿透是一个常见的问题,但是我们可以使用一些技巧和实践来避免这个问题。这篇文章介绍了一些解决 Redis 缓存穿透问题的技巧,如布隆过滤器和预处理,以及实现缓存穿透解决方案的示例代码。我们可以根据实际情况来选择适合我们业务需求的解决方案。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65b14ce8add4f0e0ffa923ff


猜你喜欢

  • Vue.js 中的组件通信技巧和实现方案 —— 实践经验

    Vue.js 是一个简单易用又功能丰富的 JavaScript 框架,它以组件为基础,使得开发者能够轻松地构建前端应用程序。在实际开发中,组件通信是一项非常重要的技术,本文将介绍 Vue.js 中的组...

    9 个月前
  • RxJS 中使用 buffer 操作符来处理数据流缓冲

    RxJS 是一个针对异步和基于事件的应用程序的响应式编程库。它提供了许多丰富的操作符和方法来处理和转换数据流。 本文将介绍 RxJS 中的 buffer 操作符,它可以用来处理数据流缓冲。

    9 个月前
  • Serverless 框架如何实现请求方 IP 限制

    在现代的web应用程序中,安全性和隐私性通常是不可或缺的。其中一个关键的安全措施就是限制可访问应用程序的IP地址。如果您正在使用 Serverless 框架构建应用程序,那么您应该知道如何实现这个功能...

    9 个月前
  • PostgreSQL 性能优化之索引优化

    在实际的开发中,数据库性能往往是系统性能的瓶颈之一。而索引优化是一种常见的提高数据库性能的方式。在 PostgreSQL 中,优化索引可以让查询更快,减小系统负担。

    9 个月前
  • PWA 中 SW 生命周期及缓存策略详解

    前言 在现代 web 应用中,PWA(Progressive Web App)成为了越来越流行的选择。PWA 带来了可靠、快速、可免费安装到桌面以及离线工作等良好的用户体验。

    9 个月前
  • Deno 中如何使用第三方模板引擎

    在近年来,Deno 作为一个新的 JavaScript 运行时环境出现在前端开发领域中,受到了越来越多人的关注。在 Deno 中使用第三方模板引擎是非常常见的需求,本文将对在 Deno 中使用第三方模...

    9 个月前
  • 如何使用 Jest 测试 JavaScript 应用程序?

    Jest 是一款由 Facebook 开发的 JavaScript 测试框架,它不仅易于上手,而且拥有丰富的功能和插件。本文将介绍 Jest 的基本用法和注意事项,帮助大家快速学习如何使用 Jest ...

    9 个月前
  • ES7 中的 Symbol.hasInstance:如何使用和解决常见的 bug

    在 ES7 中,新增了一个叫做 Symbol.hasInstance 的方法,可以用于自定义 instanceof 操作符的行为,使其在判断某个对象是否是一个类的实例时,支持自定义规则,进一步提高了 ...

    9 个月前
  • 如何在 PM2 中监控 Node.js 应用的 CPU 使用率?

    在 Node.js 应用的开发过程中,我们明显会遇到 CPU 性能问题,因此需要监控 Node.js 应用的 CPU 使用率。本文将介绍如何在 PM2 中监控 Node.js 应用的 CPU 使用率,...

    9 个月前
  • 在 GraphQL 代码中使用 JavaScript Map 函数

    GraphQL 是一种用于 API 的查询语言,它允许客户端精确地指定需要从服务器中获取的数据,使得数据获取更加高效和精确。在前端开发中,GraphQL 的使用越来越普遍,但在数据处理过程中,我们常常...

    9 个月前
  • Koa.js 使用 Cookie 的方法详解

    在 Web 开发中,HTTP Cookie 是一种存储在客户端的小型文本文件,用于存储用户的身份认证信息、会话数据等等。Koa.js 是一个轻量级的 Node.js Web 框架,它提供了一种简单的方...

    9 个月前
  • ES8 新增功能 ——JavaScript 异步操作中的 Promise.prototype.finally() 方法

    随着前端技术的飞速发展,JavaScript 作为前端开发的一大核心,也在不断地升级和更新,不断推出新的功能和方法,以便更好地满足开发者的需求。其中,ES8 新增的 Promise.prototype...

    9 个月前
  • Hapi 中如何使用 JWT 进行身份验证?

    随着前后端分离的趋势不断发展,前端的工作越来越复杂。在实现一些复杂的业务逻辑时涉及到身份验证的问题,这时候就需要使用到 JWT 技术。JWT 即 Json Web Token,它是一种轻量级的身份认证...

    9 个月前
  • Tailwind 中如何优雅地处理媒体查询?

    在前端开发中,媒体查询是非常常见的操作。通过媒体查询,可以根据屏幕宽度、设备类型等条件来调整页面的布局和样式。在 Tailwind CSS 中,我们可以通过一些优雅的方式来处理媒体查询,让代码更加简洁...

    9 个月前
  • 如何在 Jest 测试中使用 ESLint 进行代码检查

    如何在 Jest 测试中使用 ESLint 进行代码检查 ESLint 是一个广泛使用的 JavaScript 代码静态分析工具,而 Jest 是一个 Facebook 推出的测试框架,它让编写测试变...

    9 个月前
  • Chai 中提供的 closeTo 判断两个浮点数是否接近的方法

    在前端开发中,有时候需要判断两个浮点数是否近似相等。然而,由于计算机精度有限,在进行浮点数运算时会出现精度误差,导致两个看起来相同的数实际上不相等。这时候,我们需要借助于一些工具来消除误差,确保结果的...

    9 个月前
  • Mocha 测试框架中的代码覆盖率测试详解

    在前端开发中,测试是必不可少的一环。为了保证代码的质量、稳定性和可维护性,我们需要对其进行各种测试。在测试中,代码覆盖率是一个很重要的指标。它可以帮助我们了解代码的测试覆盖情况,并进一步优化测试用例。

    9 个月前
  • ECMAScript 2020 源码阅读笔记

    ECMAScript 2020是JavaScript的最新标准,它包含了一些新的语言特性和新的API。在本文中,我们将深入了解ECMAScript 2020的特性,并通过源码阅读的方式来学习和理解这些...

    9 个月前
  • ES10 中新增的字符串扩展函数 trimStart 和 trimEnd 的实用性应用

    在 JavaScript 中操作字符串是前端开发中最常见的操作之一,ES10 新增了两个字符串扩展函数 trimStart 和 trimEnd,这两个扩展函数可以帮助我们更方便地操作字符串。

    9 个月前
  • 避免使用 ES9 中 RegExp.prototype [@@matchAll]() 导致的性能问题

    在 ES9 中,RegExp 原型新增了 @@matchAll 方法,该方法可以一次性匹配字符串中所有的匹配项并返回一个 可迭代对象(Iterable),方便了对字符串的匹配操作。

    9 个月前

相关推荐

    暂无文章