深入剖析 Redis 过期删除策略

news/2025/1/20 4:20:37/

深入剖析 Redis 过期删除策略

在当今大数据和高并发的时代,缓存技术对于提升系统性能至关重要,而 Redis 作为一款广泛使用的高性能键值对存储数据库,其过期删除策略更是其中的关键一环。今天,就来和大家深入探讨一下 Redis 过期删除策略,同时结合实际工作中的项目复盘,分享一些技术要点,文末还会给大家推荐 10 本 Redis 进阶书籍,助力大家在职场中不断提升。

一、Redis 过期删除策略原理

Redis 为每个设置了过期时间的键值对维护了一个过期字典。当一个键值对设置了过期时间,它的过期时间就会被记录到这个过期字典中。Redis 通过过期删除策略,来决定何时删除这些过期的键值对,从而释放内存空间。

二、过期删除策略类型

定时删除

原理:在设置键的过期时间时,同时创建一个定时器,当过期时间到达时,立即执行删除操作。

优点:能及时释放内存,保证内存空间的高效利用。

缺点:对 CPU 不友好,因为定时器的创建和执行都会占用 CPU 资源,尤其是在大量键同时过期的情况下,会严重影响 Redis 的性能。

工作实践案例:在之前的一个实时数据处理项目中,我们尝试使用定时删除策略处理一些时效性极高的数据。但在数据量增大时,服务器 CPU 使用率急剧上升,导致系统响应变慢。后来经过分析,发现是定时删除策略带来的大量 CPU 开销所致,于是我们对策略进行了调整。

惰性删除

原理:当客户端访问某个键时,Redis 会检查该键是否过期,如果过期则删除该键,然后返回相应结果。

优点:对 CPU 友好,只有在访问过期键时才会进行删除操作,不会主动消耗 CPU 资源。

缺点:会导致内存浪费,因为过期键可能长时间占用内存,直到被访问才会被删除。

工作实践案例:在一个电商项目的商品缓存模块中,我们采用了惰性删除策略。但在项目上线一段时间后,发现服务器内存使用率持续上升。经过排查,发现是一些很少被访问的过期商品缓存键一直占用内存,这就是惰性删除策略的缺点体现。

定期删除

原理:Redis 会每隔一段时间(如 100ms)随机抽取一定数量的键,检查这些键是否过期,并删除过期的键。

优点:是一种折中的方案,既不会像定时删除那样过度消耗 CPU,也不会像惰性删除那样导致大量内存浪费。通过调整抽取的频率和数量,可以在 CPU 性能和内存使用之间找到一个平衡点。

缺点:无法保证所有过期键都能及时被删除,仍然可能存在少量过期键长时间占用内存的情况。

工作实践案例:在一个社交平台的用户会话缓存模块中,我们使用了定期删除策略。通过不断调整定期检查的时间间隔和每次检查的键数量,我们在保证系统性能的同时,有效控制了内存的使用。

三、项目复盘与优化策略

在实际项目中,我们往往需要根据业务场景选择合适的过期删除策略,或者组合使用多种策略。例如,对于一些对时效性要求极高且数据量较小的场景,可以适当结合定时删除策略;对于一般性的缓存场景,定期删除和惰性删除的组合通常能满足需求。同时,我们还需要根据服务器的性能指标(如 CPU 使用率、内存使用率)不断调整策略的参数,以达到最佳的性能表现。

四、Redis 进阶书籍推荐

《Redis 设计与实现》:深入剖析 Redis 内部的数据结构、命令实现以及持久化等机制,是深入理解 Redis 的经典之作。

《Redis 实战》:通过实际案例,详细介绍了 Redis 在缓存、消息队列、分布式锁等方面的应用,非常适合实践学习。

《Redis 高级教程》:涵盖了 Redis 的高级特性和应用场景,如集群部署、性能优化等内容。

《Redis 核心原理与实战》:从原理到实战,全面讲解 Redis 的核心技术,帮助读者快速掌握 Redis 的应用和优化技巧。

《Redis 深度历险:核心原理与应用实践》:不仅讲解 Redis 的原理,还分享了作者在实际工作中的经验和技巧,具有很高的参考价值。

《Redis 开发与运维》:介绍了 Redis 的开发、运维相关知识,包括部署、监控、故障排查等方面。

《Redis 入门指南》:适合初学者,以简洁易懂的方式介绍 Redis 的基本概念和操作。

《NoSQL 数据库原理与实践(Redis 篇)》:系统阐述 Redis 作为 NoSQL 数据库的原理和实践应用。

《Redis 技术内幕:核心数据结构与对象机制解析》:深入解析 Redis 的核心数据结构和对象机制,帮助读者深入理解 Redis 的运行原理。

《Redis 企业级开发实战》:结合企业级项目案例,讲解 Redis 在高并发、分布式系统中的应用和优化。

通过对 Redis 过期删除策略的深入理解和在实际项目中的合理运用,以及不断学习相关的知识,我们能够更好地发挥 Redis 的性能优势,为我们的项目提供更强大的支持。希望以上内容对大家有所帮助,在技术的道路上不断前行。


http://www.ppmy.cn/news/1564579.html

相关文章

集群内SSH免密登录及批处理

集群内SSH免密登录及批处理 一、背景二、操作步骤(默认在主节点操作)1. 为 root 用户设置密码并允许SSH登录(在**每台主机**上操作)2. 在主节点安装 pdsh,用于批量执行命令3. 创建集群主机列表4. 编写自动生成SSH密钥的…

深度学习学习笔记(第30周)

一、摘要 本周报的目的在于汇报第30周的学习成果,本周主要聚焦于基于深度学习的图像分割领域的常用模型U-net。   U-net是最常用、最简单的一种分割模型,在2015年被提出。UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络…

解决Spring Boot中Druid连接池“discard long time none received connection“警告

在使用Spring Boot结合Druid连接池时,开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种…

vue 前端优化性能优化方法

1.列表使用唯一 key v-for"item in activeList" :key"item.id"原因是不使用 key 或者列表的 index 作为 key 的时候,每个元素对应的位置关系都是 index,直接导致我们插入的元素到后面的全部元素,对应的位置关系都发生了变…

如何写好ChatGPT的提示词:从入门到专家

在人工智能的飞速发展中,ChatGPT 等语言模型已经成为人们解决问题、生成内容和提升效率的强大工具。然而,要充分发挥这些模型的潜力,关键在于如何设计有效的提示词(Prompt)。本文将从基础概念到高级技巧,全…

Kotlin函数类型探索:T.()->Unit的扩展函数、无参函数()->Unit与类型参数函数(T)->Unit

在Kotlin编程语言的丰富特性中,函数类型扮演着至关重要的角色。它们不仅定义了代码的行为,还通过灵活的类型系统促进了代码的重用和模块化。本文将深入探讨Kotlin中的三种核心函数类型:T.()->Unit的扩展函数、无参函数()->Unit以及类型…

php-2025面试题准备

一、TCP、UDP、Unix Socket、HTTP、 WebSoct 1、概念 TCP:面向连接可靠的传输协议,会先建立连接,有确认应答、重传机制主要目的是保证数据的顺序性和完整性,常用于文件传输 FTP、电子邮件、网络浏览等大部分应用。 UDP&#xf…

【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行

OpenHarmony LiteOS-M基于Qemu RISC-V运行 系列文章目录更新日志OpenHarmony技术架构OH技术架构OH支持系统类型轻量系统(mini system)小型系统(small system)标准系统(standard system) 简介环境准备安装QE…