Redis 中如何自动删除过期的 key

在使用 Redis 缓存数据时,有时我们需要设置一个 key 在一定时间后自动过期。当数据过期时,Redis 应该自动删除这个 key,以释放内存空间。那么,Redis 中如何实现自动删除过期的 key 呢?

Redis 过期时间

Redis 中的每个 key 都可以设置一个过期时间(expire time),表示这个 key 在多长时间后过期。可以使用 EXPIRE 命令设置 key 的过期时间,例如:

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

在设置了 key 的过期时间之后,可以使用 TTL 命令查看 key 的剩余过期时间:

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

当 key 的过期时间为 0 时,表示这个 key 已经过期了。

Redis 过期策略

Redis 中有两种过期策略:

  • 定期删除:Redis 定期(默认每秒)扫描数据库中的 key,如果发现有过期的 key,就删除它。

  • 惰性删除:Redis 在获取某个 key 时,会先检查这个 key 是否过期,如果过期了就删除它。

这两种策略各有优缺点。定期删除策略可以在一定程度上减少 Redis 的内存占用,但有可能会导致过期的 key 大量积累,从而影响 Redis 的性能。惰性删除策略可以避免过期 key 大量积累的问题,但可能会导致 Redis 内存占用过高。

为了在性能和内存占用之间取得平衡,Redis 采用了折中的方案:每次执行惰性删除时,随机选择一些 key 进行删除。这样可以避免过期 key 大量积累,同时不会影响 Redis 的性能。

Redis 自动删除过期 key

Redis 中可以使用过期时间和过期策略来自动删除过期的 key。具体来说,通过设置过期时间和合理的过期策略,可以使 Redis 在运行时自动删除过期的 key,从而释放内存空间。

设置过期时间

在 Redis 中,可以使用 EXPIRE 或 PEXPIRE 命令设置 key 的过期时间。例如:

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

还可以使用 EXPIREAT 或 PEXPIREAT 命令设置 key 的过期时间,这两个命令接收一个 UNIX 时间戳作为参数,表示 key 在该时间点后过期。例如:

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

使用过期策略

Redis 中的两种过期策略各有优缺点,可以根据实际情况选择合适的过期策略。

为了避免过期 key 大量积累的问题,可以通过修改 Redis 配置文件(redis.conf)中的以下参数来调整惰性删除的策略:

  • maxmemory:指定 Redis 最大使用的内存容量。

  • maxmemory-policy:指定 Redis 内存达到上限时采取的策略,可以为 noeviction(不进行清理)、volatile-lru(按照虚拟内存 LRU 算法清理过期 key)、volatile-ttl(按照剩余过期时间清理过期 key)等。

  • maxmemory-samples:指定惰性删除时随机采样的 key 的数量。

监控过期 key

除了设置过期时间和过期策略外,还可以通过监控 Redis 中的 key 来实现自动删除过期的 key。具体来说,可以使用 Redis 提供的 Expired Events(过期事件)来监控过期的 key,然后在事件处理程序中删除这些 key。可以使用以下命令订阅 Expired Events:

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

该命令将让 Redis 订阅所有数据库(编号为 0)中的 key 过期事件。当有过期 key 时,Redis 将发布一个消息给订阅者,消息的频道为 keyevent@0:expired,消息体为过期的 key,可以通过以下命令来处理这些消息:

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

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

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

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

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

--- -- - - ---

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

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

总结

通过设置过期时间、过期策略和监控过期 key,可以实现 Redis 自动删除过期的 key,从而释放内存空间,提高系统性能。需要注意的是,定期删除策略和惰性删除策略各有优缺点,应根据实际情况选择适合的策略。同时,为了避免过期 key 大量积累的问题,还可以定期清理过期的 key。

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


猜你喜欢

  • 如何利用 Swagger 来设计 RESTful API

    前言 RESTful API 是现代应用程序中常见的一种 API 设计风格,它采用 HTTP 协议来传递和操作数据资源。在设计 RESTful API 时,需要遵循一些规范和最佳实践,以确保 API ...

    6 个月前
  • 解决 LESS 编译报错:Expected '}' in mixins.less

    LESS 是一种动态样式语言,它扩展了 CSS,使其更具可读性和可维护性。在前端开发中,LESS 的使用已经越来越普遍。但是,有时候在编译 LESS 文件的时候,会遇到这样的报错:Expected '...

    6 个月前
  • Redux 使用 Typescript 的实践

    Redux 是一个流行的 JavaScript 应用程序状态管理库,它可以帮助开发人员轻松管理应用程序的状态,并实现可预测的状态变化。然而,Redux 在使用时需要关注很多细节,特别是在处理异步操作和...

    6 个月前
  • ScrapyJS 爬虫中的 AngularJS

    近年来,Web 技术的快速发展使得前端技术日新月异。其中,AngularJS 是一种流行的前端框架,它通过数据绑定和依赖注入等特性,使得前端开发更加高效和易于维护。

    6 个月前
  • Jest + Enzyme 单元测试实战

    随着前端技术的发展,前端单元测试已经成为了一个必不可少的环节。在前端开发中,我们经常使用 Jest 和 Enzyme 来进行单元测试。Jest 是 Facebook 开发的一个 JavaScript ...

    6 个月前
  • 在 Next.js 应用中使用 AJAX 的最佳实践

    在现代 Web 应用中,AJAX 已经成为了不可或缺的一部分。它使得我们能够在不刷新整个页面的情况下,异步地获取数据并更新页面的部分内容。Next.js 是一个流行的 React 框架,它提供了一个简...

    6 个月前
  • 无障碍性问题的修复方法

    在前端开发中,无障碍性问题是一个重要的问题。无障碍性是指让所有用户都能够方便地使用网站或应用,包括身体上或认知上有特殊需求的用户。在设计和开发过程中,我们需要考虑如何使网站或应用能够被盲人、聋哑人、老...

    6 个月前
  • ESLint 如何帮助你规范化代码的文件命名

    引言 在前端开发中,良好的代码规范和结构是非常重要的。其中一个重要的方面是文件命名规范。文件命名规范可以让我们更好地组织代码,提高代码的可维护性和可读性。ESLint 是一个非常流行的 JavaScr...

    6 个月前
  • RxJS 中 transform 操作符的使用技巧

    RxJS 是一个流式编程库,它提供了多种操作符来处理数据流。其中,transform 操作符是一种非常常用的操作符,它可以将一个数据流转换为另一个数据流,同时可以进行过滤、排序、映射等操作。

    6 个月前
  • Redis 性能优化:使用缓存

    前言 Redis 是一款高性能的 NoSQL 数据库,它的速度快、可靠性高,已经成为了许多互联网公司的首选数据库。但是,为了保证 Redis 的高性能,我们需要进行一些优化,其中最重要的就是使用缓存。

    6 个月前
  • Sequelize 如何针对巨大的数据集进行性能优化

    前言 Sequelize 是一个基于 Node.js 的 ORM(Object-Relational Mapping)框架,它支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 ...

    6 个月前
  • 如何在 Webpack 中使用 ESLint 检查代码质量

    随着前端技术的不断发展,代码质量的重要性也越来越受到重视。ESLint 是一个用于检查 JavaScript 代码质量的工具,通过规则配置可以检查代码中的语法错误、代码风格问题等。

    6 个月前
  • 解决 Jest 测试 React Native 应用时遇到的坑

    在 React Native 开发中,测试是非常重要的一环。而 Jest 是 React Native 开发中常用的测试库之一。但是在使用 Jest 进行测试时,我们可能会遇到一些坑。

    6 个月前
  • TypeScript 的非空断言操作符!

    TypeScript 是一种由 Microsoft 开发的开源编程语言,是 JavaScript 的超集,它增加了静态类型、类、接口等特性,使得 JavaScript 代码更加可读、可维护、可靠。

    6 个月前
  • 使用 CSS Flexbox 实现复杂的布局

    在前端开发中,实现复杂的布局一直是一项挑战。过去,我们通常使用 float、position、table 等方式来实现布局。但是,这些方法有时会导致代码混乱、难以维护和响应式设计的困难。

    6 个月前
  • Deno 中的日志记录技巧

    在前端开发中,日志记录是非常重要的一部分,它可以帮助我们更好地了解应用程序的运行情况,排查问题并提高代码质量。而在 Deno 中,我们同样需要进行日志记录,本文将介绍一些 Deno 中的日志记录技巧,...

    6 个月前
  • Promise 中的数组批量处理技巧

    在前端开发中,经常需要对数组进行批量处理,例如对数组中的每个元素进行异步操作。使用 Promise 可以很好地解决这个问题。在本文中,我们将介绍 Promise 中的数组批量处理技巧,帮助你更好地理解...

    6 个月前
  • 如何使用 Fastify 实现 API 缓存

    随着互联网技术的发展,API 已经成为现代应用程序的重要组成部分。然而,由于 API 的高并发访问和大量数据处理,API 的性能往往成为瓶颈。为了解决这个问题,我们可以使用缓存技术来提高 API 的性...

    6 个月前
  • Serverless 架构:如何使用 API Gateway 和 Lambda 实现 RESTful API?

    前言 随着云计算技术的不断发展,Serverless 架构已经成为了一种趋势。相比于传统的客户端-服务器架构,Serverless 架构具有更高的可扩展性、更低的成本和更快的开发速度。

    6 个月前
  • 如何自定义 CSS Reset 样式

    在前端开发中,为了解决不同浏览器对网页元素默认样式的差异,我们通常会使用 CSS Reset 来统一不同浏览器的默认样式。但是,大多数 CSS Reset 库都是通用的,可能会覆盖你所需要的一些样式,...

    6 个月前

相关推荐

    暂无文章