Redis删除过期key策略

文章目录

      • 前言
      • Redis中key的的过期时间
        • 在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)
        • 使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)
        • 使用 PEXPIRE 命令设置过期时间(毫秒级)
        • 使用 PEXPIREAT 命令设置毫秒级精确过期时间
        • 在 Redis 配置文件中设置所有 key 的默认过期时间
        • 使用 PERSIST 命令可以移除一个 key 的过期时间设置
        • 使用 TTL 命令可以查看一个 key 剩余的过期时间
      • Redis过期键删除策略
        • **1、定时删除**
        • **2、定期删除**
        • **3、惰性删除**
      • 总结
      • 写在最后

579a429daf314744b995f37351b46548

前言

Redis是一款高性能的开源内存数据库,广泛应用于缓存、消息队列、实时分析等场景。在Redis中,我们经常需要删除过期的key,以释放内存空间并保持数据的有效性。本文将为您详细介绍Redis的过期key删除策略,帮助您更好地管理和优化Redis数据库。


Redis中key的的过期时间

Redis 中可以为 key 设置过期时间,到期后 key 会自动被删除,过期时间可以通过以下几种方式设置:

image-20231016152329366

  1. 在创建 key 时使用 EXPIRE 命令设置过期时间(秒级)

    示例:

    EXPIRE key1 30 # 30秒过期
    
  2. 使用 EXPIREAT 命令设置一个精确的过期时间(unix 时间戳)

    示例:

    EXPIREAT key2 1651811000 # 2022-05-06 14:30:00 过期
    
  3. 使用 PEXPIRE 命令设置过期时间(毫秒级)

    示例:

    PEXPIRE key3 6000 # 6秒过期
    
  4. 使用 PEXPIREAT 命令设置毫秒级精确过期时间

    示例:

    PEXPIREAT key4 1651811000000 # 2022-05-06 14:30:00.000过期 
    
  5. 在 Redis 配置文件中设置所有 key 的默认过期时间

    通过 default-ttl 参数配置默认过期时间

    # redis.conf
    default-ttl 3600 # 默认1小时过期
    
  6. 使用 PERSIST 命令可以移除一个 key 的过期时间设置
    PERSIST key2 # 移除key2的过期时间
    
  7. 使用 TTL 命令可以查看一个 key 剩余的过期时间
    TTL key3 # 查看key3的剩余过期时间
    

Redis 提供了灵活的 key 过期时间设置,可以按需为不同 key 设置过期时间。


Redis过期键删除策略

image-20231016160151711

Redis key过期的方式有三种:

  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  • 当前已用内存超过maxmemory限定时,触发主动清理策略
1、定时删除

定时删除是在设置key的过期时间的同时,会创建一个定时器(timer)。定时器在key的过期时间来临时,立即执行对key的删除操作。
此种删除策略可以保证过期key会尽可能快的被删除,并释放过期key所占用的内存。
但是此种策略对CPU时间是最不友好的。在过期key比较多的情况下,删除过期key这一行为可能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期key上,无疑会对服务器的响应时间和吞吐量造成影响。
例如,正有大量的命令请求在等待服务器处理,并且服务器当前不缺少内存的情况下,服务器应当优先将CPU时间用在处理客户端的命令请求上面,而不是用在删除过期key上面。
并且创建一个定时器(timer)需要用到Redis服务器中的时间事件,而当前时间事件是用无序链表实现的,查找一个事件的时间复杂度为O(N),并不能高效地处理大量时间事件。要让服务器创建大量的定时器,从而实现定时删除,在现阶段来说并不现实。

优点:
1.可以自动清理不需要的缓存数据,减少内存占用。
2.可以定时刷新部分缓存,保证数据实时性。
3.可以根据业务需求自定义不同的数据缓存周期。
4.操作简单,只需要设置过期时间,不需要手动删除。

缺点:
1.需要额外的内存来存储 key 的过期时间。
2.过期删除是被动操作,无法按需主动删除。
3.过期时间的精度只到秒级,无法更细粒度控制。
4.如果过期 key 数量很多,过期删除时还是有一定性能开销。
5.只依赖过期时间可能导致一段时间内缓存量激增,需配合其它方式控制。

示例:

// 设置10秒过期
jedis.setex("data", 10, "cache"); 
2、定期删除

定期删除是指Redis会每隔一段时间,对部分key进行检查和删除。具体来说,Redis会每隔一段时间随机抽取一部分key,检查其是否过期,如果过期则删除。

优点:

1.减少每次访问的时间复杂度。

2.减少删除操作对CPU时间的影响。

缺点:

可能会有一些过期key没有被及时删除。

通过定期删除策略,可以有效地减少因为过期key而带来的内存浪费。

示例:

// 定期扫描删除
public void delKeys(){Set<String> keys = jedis.keys("cache:*");jedis.del(keys.toArray(new String[0])); 
}// 调度执行
scheduledExecutorService.scheduleAtFixedRate(this::delKeys, 0, 1, TimeUnit.HOURS);
3、惰性删除

惰性删除是指在访问某个key时,Redis会先检查该key是否过期,如果过期则立即删除。这种策略的优点是能够及时释放内存空间,但缺点是会增加每次访问的时间复杂度,因为需要进行过期检查。

惰性删除是定时删除和定期删除的折中处理方案。它放任key过期不管,但是每次获取key时,都会检查取得的key是否过期,如果过期,则删除该key;若没有过期,就返回该key的值。

优点:

对CPU时间来说是最友好的,只在取出key时,才对key进行过期检查,即只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的key,不会在删除其他无关的过期key上花费任何CPU时间。

缺点:

对内存是最不友好的。如果一个key已经过期,而这个key又仍然保留在db中,那么只要这个过期key不被删除,它所占用的内存就不会释放。例如,如果db中有非常多的过期key,而这些过期key又恰好没有被访问到的话,那它们也许永远也不会被删除,除非用户手动执行flushdb命令清空,这样会导致大量的无用的脏数据占用大量的内存。

示例:

jedis.set("key", "value");
jedis.unlink("key"); // 惰性标记删除

总结

Redis的过期key删除策略是惰性删除、定期删除和定时删除的混合策略。惰性删除能够及时释放内存空间,但会增加每次访问的时间复杂度;定期删除能够减少时间复杂度,但可能会有一些过期key没有被及时删除;定时删除能够精确控制过期时间,但需要额外的定时任务。通过这种混合策略,Redis能够在保证内存空间的同时,尽可能地减少对性能的影响。


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/159882.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git log 美化配置

编辑 vim ~/.gitconfig 添加配置 [alias]lg log --graph --abbrev-commit --decorate --dateformat:%m-%d %H:%M:%S --formatformat:%C(bold blue)%h%C(reset) - %s %C(bold yellow)% d%C(reset) %n %C(dim white) (%ad) - %an%C(reset) --allgit lg 效果

docker-machine常用

docker-machine常用 什么是Docker Machine&#xff1f;Docker Machine默认支持的驱动安装kvm驱动 安装和配置Docker Machine环境准备node1安装Dockernode1安装Docker Machine为Docker Machine安装自动补全为Docker Machine准备boot2docker.iso镜像为node2创建machine主机 管理远…

全天在线的健康小助手,dido E55S Pro智能手表体验

如今只需要借助一块具有健康监测功能的智能手表&#xff0c;我们就可以轻松记录自己的日常健康数据&#xff0c;像是心率、血压和血氧等&#xff0c;通过每天规律性评估&#xff0c;我们可以及时发现身体的一些变化&#xff0c;排除一些潜在的健康隐患。最近我尝试了一款国产的…

AUTOSAR组织发布20周年纪念册,东软睿驰NeuSAR列入成功案例

近日&#xff0c;AUTOSAR组织在成立20周年之际发布20周年官方纪念册&#xff08;20th Anniversary Brochure&#xff09;&#xff0c;记录了AUTOSAR组织从成立到今天的故事、汽车行业当前和未来的发展以及AUTOSAR 伙伴关系和合作在重塑汽车方面的作用。东软睿驰提报的基于AUTOS…

【计算机网络笔记】数据交换之报文交换和分组交换

系列文章目录报文交换分组交换存储-转发报文交换 vs 分组交换总结 系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 报文交换 报文&#xff1a;源&#xff08;应用&#xff09;发送的信息整体。比如一个文件、一…

LeetCode【74】搜索二维矩阵

题目&#xff1a; 代码&#xff1a; public static boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 先找到行&#xff0c;行为当前行第一列<target&#xff0c;当前行1行&#xff0c;第一列>targetfor…

45.复购率问题求解

思路分析&#xff1a; &#xff08;1&#xff09;近xx天&#xff0c;最大日期肯定就是最新的一天&#xff0c;故先用max(order_date) over() today计算当天日期 &#xff08;2&#xff09;过滤出最近90天的订单并且按照user_id,product_id分组求购买次数&#xff1b; &#xff…

vim工具的使用

目录 vi/vim键盘图 1、vim的基本概念 2、vim的基本使用 3、vim命令模式命令集 4、vim底行模式命令集 5、参考资料 vi/vim键盘图 1、vim的基本概念 vi和vim的区别&#xff1a;vi和vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi…

QT 串口编程 QSerialPort

//创建串口对象QSerialPort s new QSerialPort("/dev/ttySAC2", this);//配置串口信息s->setBaudRate(QSerialPort::Baud9600);//波特率s->setDataBits(QSerialPort::Data8);//数据位s->setStopBits(QSerialPort::OneStop);//奇偶校验s->setParity(QSer…

【计算机毕设选题推荐】产品管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot和SSM的产品管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、产品…

使用 Apache Camel 和 Quarkus 的微服务(五)

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 在本系列的第三部分中&#xff0c;我们了解了如何在 Minikube 中部署基于 Quarkus/Camel 的微服务&#xff0c;这是最常用的 Kubernetes 本地实现之一。虽然这样的本地…

ITextRenderer将PDF转换为HTML详细教程

引入依赖 <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.18</version></dependency> 问题一&#xff1a;输出中文字体 下载字体simsun.ttc 下载链接&am…

【SpringCloud-11】SCA-sentinel

sentinel是一个流量控制、熔断降级的组件&#xff0c;可以替换第一代中的hystrix。 hystrix用起来没有那么方便&#xff1a; 1、要在调用方引入hystrix&#xff0c;没有ui界面进行配置&#xff0c;需要在代码中进行配置&#xff0c;侵入了业务代码。 2、还要自己搭建监控平台…

微服务11-Sentinel中的授权规则以及Sentinel服务规则持久化

文章目录 授权规则自定义异常结果规则持久化实现Push模式 授权规则 根据来源名称对请求进行拦截 ——>我们需要解析来源名称&#xff08;RequestOriginParser默认解析都为default&#xff09;&#xff0c;所以我们要自定义一个实现类&#xff08;根据请求头解析&#xff0c…

单链表---结构体实现

定义 链表称为线性表的链式存储&#xff0c;顺序表逻辑上相邻的数据&#xff0c;存储位置也相邻。链表逻辑上相邻的数据&#xff0c;存储位置是随机分布在内存的各个位置上的。 故 对于每一个结点&#xff0c;定义的结构体是&#xff1a; typedef struct _LinkNode {int d…

C# Winform编程(3)对话框

C# Winform编程&#xff08;3&#xff09;对话框 Show(string text);Show(string text, string caption);Show(string text, string caption, MessageBoxButtons buttons);Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon); using System;…

大模型的背景与现状问题

一、大模型的发展背景 谈起大模型&#xff0c;第一时间想到的是什么&#xff1f;是主流的ChatGPT&#xff1f;或者GPT4&#xff1f;还是DALL-E3&#xff1f;亦或者Midjourney&#xff1f;以及Stablediffusion&#xff1f;还是层出不穷的其他各类AI Agent应用工具&#xff1f;大…

ST-SSL:基于自监督学习的交通流预测模型

文章信息 文章题为“Spatio-Temporal Self-Supervised Learning for Traffic Flow Prediction”&#xff0c;是一篇发表于The Thirty-Seventh AAAI Conference on Artificial Intelligence (AAAI-23)的一篇论文。该论文主要针对交通流预测任务&#xff0c;结合自监督学习&#…

香港学界呼吁RWA“在港先发”,构建基于港元稳定币的Web3生态!

2023年以来&#xff0c;市场对于RWA&#xff08;Real World Assets&#xff09;即真实世界资产“代币化”的讨论愈发频繁&#xff0c;一些观点认为 RWA将在下一轮加密资产牛市中成为焦点&#xff0c;部分Web3创业者和传统金融企业也快速将业务方向瞄准相关赛道&#xff0c;而被…

架构-设计原则

1、面向对象的SOLID 1.1 概述 SOLID是5个设计原则开头字母的缩写&#xff0c;其本身就有“稳定的”的意思&#xff0c;寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。5个原则分别如下&#xff1a; Single Responsibility Principle&#xff08;SRP&#xff09;&am…