当前位置: 首页 > article >正文

Redis过期Key的逐出策略

概述

本文主要介绍阿里云云数据库Redis过期Key的逐出策略,且介绍了使用Redis的一些最佳实践。

详细信息

Redis过期Key清理策略

为了防止一次性清理大量过期Key导致Redis服务受影响,Redis会在CPU空闲时清理过期Key。具体Redis逐出过期Key的策略如下所示:

  1. 访问Key时,首先会判断Key是否过期,如果过期,则逐出过期Key。
 robj *lookupKeyRead(redisDb *db, robj *key) {
    robj *val;
    expireIfNeeded(db,key);
    val = lookupKey(db,key);
    ...
    return val;
}
  1. CPU在空闲时通过serverCron定时任务,逐出部分过期Key。
aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { ... databasesCron(); ... } void databasesCron(void) { /* Expire keys by random sampling. Not required for slaves + as master will synthesize DELs for us. */ if (server.active_expire_enabled && server.masterhost == NULL) activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW); ... }
  1. 每次在事件循环执行的时候,逐出部分过期Key。
void aeMain(aeEventLoop *eventLoop) {
    eventLoop->stop = 0;
    while (!eventLoop->stop) {
        if (eventLoop->beforesleep != NULL)
            eventLoop->beforesleep(eventLoop);
        aeProcessEvents(eventLoop, AE_ALL_EVENTS);
     }
}

void beforeSleep(struct aeEventLoop *eventLoop) {
    ...
    /* Run a fast expire cycle (the called function will return
     - ASAP if a fast cycle is not needed). */
    if (server.active_expire_enabled && server.masterhost == NULL)
       activeExpireCycle(ACTIVE_EXPIRE_CYCLE_FAST);
    ...
}

清理过期Key的算法

Redis过期Key清理的机制对清理的频率和最大时间都有限制,且会在尽量不影响正常服务的情况下,进行过期Key的清理,以达到长时间服务的最优性能。

Redis会周期性的随机测试一批设置了过期时间的Key并进行处理,测试到已过期的Key将被删除,具体的算法如下所示:

  • Redis配置项hz定义了serverCron定时任务的执行周期,该默认值为10,即CPU空闲时每秒执行10次。
  • 每次过期Key清理的时间不超过CPU时间的25%,即若hz等于1,则一次清理时间最大为250ms。若hz等于10,则一次清理时间最大为25ms。
  • 每次清理过期Key时都会依次遍历所有的库。
  • 从一个库中随机抽取20个Key,判断是否过期,若过期,则逐出过期Key。
  • 若有5个以上Key过期,则重复上一步步骤,否则遍历下一个库。
  • 在清理过程中,若达到了CPU时间的25%,则退出清理过程。

具体注意事项如下所示:

  • Redis仅分配较少的时间进行过期Key清理,且存在一定随机性,如果您对过期清理有较高的要求,可以自行扫描触发或在控制台下发过期Key清理任务。
  • 调高hz参数可以提升清理的频率,过期Key会更及时的被理,但hz太高会增加CPU时间的消耗,需要根据实际业务进行配置。

数据逐出算法

根据用户设置的逐出策略,选出待逐出的key,直到当前内存小于最大内存值为止。具体的逐出策略信息请参见默认的数据逐出策略。

使用Redis的注意事项

  • 不要存放垃圾数据,且需要及时清理无用数据。
    即实验性的数据和下线业务数据需要及时删除。
  • Key尽量都设置过期时间。
    对具有时效性的Key设置过期时间,且可通过Redis自身过期Key清理策略,降低过期Key对于内存的占用,同时也能够减少业务的运维成本,不需要定期手动清理。
  • 单Key不要过大。
    Redis单个string的value为43M,或list有几百万个成员,占用1G多内存,这种Key在访问时,网络传输延迟较大,需要分配的输出缓冲区也比较大,在定期清理的时候也容易造成比较高的延迟。因此最好能通过业务拆分或数据压缩等方式避免这种过大的Key产生。
  • 不同业务使用一个Redis时,最好使用不同的逻辑库区分业务。
    Redis的过期Key清理策略和淘汰策略都会遍历各个库,因此将Key分布在不同的库有助于过期Key的及时清理。另外不同业务使用不同库,也有助于问题排查和无用数据的及时下线。

https://help.aliyun.com/zh/redis/key-expiration-and-eviction-policies?spm=5176.smartservice_service_robot_chat_new.console-base_help.dexternal.7d4e43ecmkZB8m


http://www.kler.cn/news/363556.html

相关文章:

  • 502 错误码通常出现在什么场景?
  • K8S调度不平衡问题分析过程和解决方案
  • 【LLM之Agent】《Tool Learning with Large Language Models: A Survey》论文阅读笔记
  • AnaTraf | 网络性能监控系统NPM:提升网络性能与业务连续性
  • pdf编辑软件有哪些?方便好用的pdf编辑软件分享
  • 2024开放原子开源生态大会 | 麒麟信安携手openEuler共建开源生态,共塑产业未来
  • 101. UE5 GAS RPG 实现范围技能奥术爆发表现
  • C语言数据结构之单向链表(SingleList)
  • 【C++ 算法进阶】算法提升六
  • 《Pyhon入门:yield关键字常用用法》
  • solana phantom NFT图片显示不出来?
  • 【含开题报告+文档+PPT+源码】基于SpringBoot和Vue的编程学习系统
  • 鸿蒙中富文本编辑与展示
  • 资料下载 | ENOVIA企业集成框架解决方案
  • Spring Boot集成Shiro认证
  • Android 两种方式实现类似水波扩散效果
  • 手机pdf阅读器,用手机也能够阅读、编辑pdf文件
  • 右键以vscode打开目录的时候出现找不到应用程序
  • 亿佰特CAN转422、232、485模块解决高于115200波特率时设备失联问题
  • 一文掌握 jetbrains IDE 新 UI,还不会新 UI 的同学快看过来
  • OpenMediaVault安装插件以及重置web控制台密码
  • 软考攻略/超详细/系统集成项目管理工程师/基础知识分享18
  • Uefi Application小游戏开发之推箱子
  • idea启动报错:com.intellij.diagnostic.PluginException
  • 【数据结构】专栏开篇 | 1024程序员节
  • 信息库:Air780E量产binpkg文件的获取途径探究!