文档

通过OOS定期删除Tair或Redis过期Key

更新时间:

Redis数据过期后,Redis将根据默认策略逐步删除已过期的数据,这导致过期数据仍然占据着内存空间。您可以在系统运维管理(简称OOS)中配置定期运维任务,在业务低峰期,扫描(SCAN)所有Key并立即删除已过期的Key,释放内存占用。

背景信息

Redis为保障读写性能,其删除逻辑为异步删除。当数据过期后,Redis不会立即删除已过期的数据,而是通过主动删除(后台定期扫描、删除部分过期Key)与被动删除(当用户访问到过期Key,则删除)的方式对过期Key进行逐步删除,因此过期数据仍然占据着内存空间。在极端情况下,当大量数据同时过期时,数据会立即过期,但需要较长时间进行删除、回收内存空间。

您可以参考本方案,免费使用OOS服务,定时调用FlushExpireKeys API:Redis会扫描(SCAN)所有Key并立即删除已过期的Key。

重要

SCAN命令扫描所有数据会使实例的CPU负载上升,建议您在业务低峰期执行该任务。

前提条件

您需要为OOS服务创建一个RAM角色,用于OOS服务访问Redis服务,具体操作请参见为OOS服务设置RAM权限

  • 您可以为该角色授予系统权限策略AliyunKvstoreFullAccess。授权后,RAM角色可以管理Redis所有资源。

  • 您也可以自定义最小权限策略(允许OOS调用Redis的DescribeInstances与FlushExpireKeys API),限定该角色只能执行当前任务。

    RAM角色权限策略示例:

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "kvstore:DescribeInstances",
                    "kvstore:FlushExpireKeys"
                ],
                "Resource": "*"
            }
        ]
    }

操作步骤

  1. 访问OOS控制台

  2. 在左侧导航栏,单击自动化任务 > 定时运维

  3. 单击创建

  4. 配置定时运维任务。

    说明

    本文仅介绍关键步骤,其他参数请参见系统运维管理

    定时设置

    本示例选择周期性重复执行,指定每天04:00与16:00执行。

    image

    同时指定规则结束时间为2024-03-31 00:00:00,表示该定时运维任务将在该时间点结束,不再执行。

    选择模板

    公共模板中搜索ACS-Redis-FlushExpireKeys,并勾选该模板。

    设置模板参数

    1. 选择Redis实例所在的地域,选择目标实例。

    2. OOS扮演的RAM角色中选择在前提条件中创建的RAM角色。

    执行设置(可选)

    该页签配置项可保持默认。

  5. 单击创建,并在弹框中单击确认

    当任务的执行状态显示生效中,表示该任务将根据定时设置自动执行。

后续步骤

您可以在定时运维任务列表中,单击目标执行ID,进入任务详情页。在该页面中,您可以查看或修改任务配置信息、立即触发执行、查看执行历史信息等。

同时,由于过期数据被删除、内存得以回收,您也可以在性能监控中看到该实例的内存使用率降低了。

相关文档

  • 您也可以在OOS中配置告警与事件运维,例如当内存使用率(平均值)达到90%时,调用FlushExpireKeys API删除已过期的Key。配置方式与本方案类似,配置入口为自动化任务 > 告警与事件运维,更多信息请参见创建告警运维任务

  • 关于Tair与Redis删除过期数据的介绍,请参见Tair/Redis如何清除过期Key