redis的过期策略以及内存淘汰机制

redis采用的是定期删除+惰性删除策略 。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要

将时间应用在处理请求,而不是删除key,因此没有采用这一策略. 定期删除+惰性删除是如何工作的
呢?

定期删除: redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。 于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。 采用定期删除+惰性删除就没其他问题了么?不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。 在redis.conf中有一行配置

powershell 复制代码
maxmemory-policy volatile-lru

该配置就是配内存淘汰策略的:

volatile-lru: 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl: 从 已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random: 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru: 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random: 从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐): 禁止驱逐数据,新写入操作会报错 ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

相关推荐
不懒不懒6 分钟前
【HTML容器与表格布局实战指南】
java·开发语言
J_liaty7 分钟前
Java实现PDF添加水印的完整方案(支持灵活配置、平铺、多页策略)
java·开发语言·pdf
一路向北⁢9 分钟前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(二)
java·数据库·spring boot·sse·通信
chilavert3189 分钟前
技术演进中的开发沉思-349:高效并发(下)
java·jvm
远方160911 分钟前
112-Oracle database 26ai下载和安装环境准备
大数据·数据库·sql·oracle·database
2401_8384725112 分钟前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
光影少年28 分钟前
非关系数据库和关系型数据库都有哪些?
数据库·数据库开发·非关系型数据库
2301_8223636029 分钟前
Python单元测试(unittest)实战指南
jvm·数据库·python
麦兜*33 分钟前
深入解析分布式数据库TiDB核心架构:基于Raft一致性协议与HTAP混合负载实现金融级高可用与实时分析的工程实践
数据库·分布式·tidb
shejizuopin35 分钟前
基于SSM的高校旧书交易系统的设计与实现(任务书)
java·mysql·毕业设计·论文·任务书·基于ssm的·高校旧书交易系统的设计与实现