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

目录

一、过期策略

二、内存淘汰策略

[2.1 介绍](#2.1 介绍)

[2.2 如何选择?](#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)

相关推荐
考虑考虑13 分钟前
数据库中的EXISTS
运维·数据库·后端
Wang's Blog31 分钟前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
讳疾忌医丶1 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
郑州光合科技余经理1 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼1 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
梦想平凡2 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
xcLeigh2 小时前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
yume_sibai3 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
sunshine22 girl3 小时前
Idea中如何搜索
java·ide·intellij-idea
猫吻鱼3 小时前
【AI 01】【Spring AI 基础使用】
java·spring·spring ai