【通俗易懂】一篇文章带你了解Redis的过期策略与内存淘汰策略

server/2024/10/25 16:29:52/

目录

一、过期策略

二、内存淘汰策略

2.1 介绍

2.2 如何选择?


一、过期策略

Redis 通过设置过期时间来控制键值对的生命周期。过期时间可以通过EXPIRE、EXPIREAT、PERSIST等命令设置,也可以在插入数据时直接设置过期时间。

Redis 的过期策略采用的是定期删除和惰性删除相结合的方式:

  • 定期删除:Redis 默认每隔 100ms 就随机抽取一些设置了过期时间的 key,并检查其是否过期,如果过期就删除。定期删除是 Redis 的主动删除策略,它可以确保过期的 key 能够及时被删除,但是会占用 CPU 资源去扫描 key,可能会影 响 Redis 的性能。
  • 惰性删除:当一个 key 过期时,不会立即从内 存中删除,而是在访问这个 key 的时候才会触发删除操作。惰 性删除是 Redis 的被动删除策略,它可以节省 CPU 资源,但是会导致过期的 key 始终保存在内 存中,占用内 存空间。

Redis默认同时开启定期删除和惰性删除两种过期策略

定期删除会在Redis设置的过期键的过期时间达到一定阈值时进行一次扫描,将过期的键删除,但不会立即释放内存,而是把这些键标记为 “已过期”,并放入一个专门的链表中。然后,在Redis的内存使用率达到一定阈值时,Redis会对这些“已过期”的键进行一次内存回收操作,释放被这些键占用的内存空间。

而惰性删除则是在键被访问时进行过期检查,如果过期了则删除键并释放内存。

需要注意的是,即使Redis进行了内存回收操作,也不能完全保证被删除的内存空间会立 即被系统回收。

一般来说,这些被删除的内存空间会被操作系统标记为“可重用的内存”,等待被重新分配。因此,即使Redis进 行了内存回收操作,也并不能保证Redis所占 用的内存空间会立 即释放 给操 作系统。

二、内存淘汰策略

2.1 介绍

Redis 的内存淘汰策略用于在内存满了之后,决定哪些 key 要被删除。Redis 支持多种内存淘汰策略,可以通过配置文件中的 maxmemory-policy 参数来指定。

以下是 Redis 支持的内存淘汰策略

  • noeviction:不会淘汰任何键值对,而是直接返回错误信息。
  • allkeys-lru:从所有 key 中选择最近最少使用的那个 key 并删除。
  • volatile-lru:从设置了过期时间的 key 中选择最近最少使用的那个 key 并删除。
  • allkeys-random:从所有 key 中随机选择一个 key 并删除。
  • volatile-random:从设置了过期时间的 key 中随机选择一个 key 并删除。
  • volatile-ttl:从设置了过期时间的 key 中选择剩余时间最短的 key 并删除。
  • volatile-lfu:淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。
  • allkeys-lfu:淘汰的对象则是所有键值对中,访问频率最低的那个。

2.2 如何选择?

以下是腾讯针对Redis的淘汰策略设置给出的建议:

  • 当 Redis 作为缓存使用的时候,推荐使用 allkeys-lru 淘汰策略。该策略会将最近最少使用的 Key 淘汰。默认情况下,使用频率最低则后期命中的概率也最低,所以将其淘汰。
  • 当 Redis 作为半缓存半持久化使用时,可以使用 volatile-lru。但因为 Redis 本身不建议保存持久化数据,所以只作为备选方案。

阿里云Redis默认是volatile-lru (https://www.alibabacloud.com/help/zh/redis/user-guide/how-does-apsaradb-for-redis-evict-data-by-default)

腾讯云默认是noeviction,即不删除键。在内存占满后会出现 OOM 问题,所以建议创建好实例后修改淘汰策略,减少 OOM 问题的出现。(https://cloud.tencent.com/document/product/239/90960)


http://www.ppmy.cn/server/104506.html

相关文章

交直流充电桩检测的核心功能

交直流充电桩检测的核心功能主要包括以下几个方面: 1. 充电状态监测:充电桩检测系统需要实时监测充电设备的运行状态,包括充电电流、电压、功率等参数。通过对这些参数的实时监测,可以确保充电过程的安全和稳定。同时&#xff0c…

密码管理系统的自动化与集成:重塑安全与效率的双重飞跃

在数字化时代,密码作为保护个人信息、企业资产及敏感数据的第一道防线,其重要性不言而喻。然而,随着网络应用的激增和复杂性的提升,传统的密码管理方式——如使用简单密码、重复密码或依赖记忆——已难以满足现代安全需求&#xf…

2024/08(二) 近期关于AI的阅读和理解[笔记]

## Multi Agent/Flow 最近团队在实验 flowise 的 Agentflows 设计,顺带看了现在市面多加解决方案,这两天偶尔看到蚂蚁CodeFuse团队开发的Mulit Agent框架开发思想, 所以将他们一起总结归纳下。 Agent Base:构建了四种基本的Agent…

AutoGPT开源项目解读

AutoGPT开源项目解读 (qq.com) AutoGPT旨在创建一个自动化的自我改进系统,能够自主执行和学习各种任务 项目基本信息 首先阅读项目的README.md,下述代理和智能体两个名词可互换 项目简介:一个创建和运行智能体的工具,这些智能体…

C# 二维数组和嵌套数组

文章目录 1.二维数组2.嵌套数组 1.二维数组 数组必须等长 int[,] a new int[2, 4] { 1, 2, 3, 4,5, 6, 7, 8, } ; Console.WriteLine(a[0, 0]); // 12.嵌套数组 数组无须等长 int[][] b new int[][] {new int { 1, 2, 3, 4 },new int { 5, 6 } } Console.WriteLine(b[0]…

Python实战:如何使用K-means算法进行餐馆满意度NLP情感分析

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

初识Linux · yum和vim

目录 前言: 1 yum 1.1 yum是什么? 1.2 Centos的生态和yum的本地配置 1.3 yum的相关操作 2 vim 前言: 我们学习Linux的时候,是有编程语言的基础的,那么呢,我们学习Linux的时候最迫切的就是希望能打印…

第6天:常用的Python库和框架——Flask:Web开发框架简介

引言: Flask 是一个简单而灵活的 Python Web 开发框架。它被设计成易于使用,并且能够快速开发 Web 应用程序。Flask 提供了一个简洁的核心,并以扩展的方式提供了许多功能。作为一个微型框架,Flask 提供了最基本的功能&#xff0c…