简介、我们先来看如下几个问题:

①、如何设置Redis键的过期时间 ?

②、设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗 ?

③、如何设置Redis的内存大小?当内存满了之后,Redis有哪些内存淘汰策略?我们又该如何选择 ?

一、设置Redis键过期时间

1、Redis提供了四个命令来设置过期时间(生存时间)

①、EXPIRE :表示将键 key 的生存时间设置为 ttl 秒。

②、PEXPIRE :表示将键 key 的生存时间设置为 ttl 毫秒。

③、EXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳。

④、PEXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的毫秒数时间戳。

注释:在Redis内部实现中,前面三个设置过期时间的命令最后都会转换成最后一个PEXPIREAT 命令来完成。

返回键的剩余生存时间

  • TTL :以秒的单位返回键 key 的剩余生存时间。

  • PTTL :以毫秒的单位返回键 key 的剩余生存时间。

2、Redis过期时间的判定

在Redis内部,每当我们设置一个键的过期时间时,Redis就会将该键带上过期时间存放到一个过期字典中。当我们查询一个键时,Redis便首先检查该键是否存在过期字典中,

如果存在,那就获取其过期时间。然后将过期时间和当前系统时间进行比对,比系统时间大,那就没有过期;反之判定该键过期。

二、过期删除策略

删除策略就是针对已过期数据的处理策略,已过期的数据不一定被立即删除,在不同的场景下使用不同的删除方式会有不同效果,在内存占用与 CPU 占用之间寻找一种平衡,

顾此失彼都会造成整体 Redis 性能的下降,甚至引发服务器宕机或内存泄露

针对过期数据有三种删除策略:

  • 定时删除

  • 惰性删除(被动删除)

  • 定期删除

1、定时删除

在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间到达时,立即执行对键的删除操作

  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用

  • 缺点:对 CPU 不友好,无论 CPU 此时负载多高均占用 CPU,会影响 Redis 服务器响应时间和指令吞吐量

  • 总结:用处理器性能换取存储空间(拿时间换空间)

创建一个定时器需要用到 Redis 服务器中的时间事件,而时间事件的实现方式是无序链表,查找一个事件的时间复杂度为 O(N),并不能高效地处理大量时间事件,所以采用这种方式并不现实

2、惰性删除

数据到达过期时间不做处理,等下次访问到该数据时执行 expireIfNeeded() 判断:

  • 如果输入键已经过期,那么 expireIfNeeded 函数将输入键从数据库中删除,接着访问就会返回空

  • 如果输入键未过期,那么 expireIfNeeded 函数不做动作

所有的 Redis 读写命令在执行前都会调用 expireIfNeeded 函数进行检查,该函数就像一个过滤器,在命令真正执行之前过滤掉过期键

惰性删除的特点:

  • 优点:节约 CPU 性能,删除的目标仅限于当前处理的键,不会在删除其他无关的过期键上花费任何 CPU 时间

  • 缺点:内存压力很大,出现长期占用内存的数据,如果过期键永远不被访问,这种情况相当于内存泄漏

  • 总结:用存储空间换取处理器性能(拿空间换时间)

3、定期删除

定期删除策略是每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响

  • 如果删除操作执行得太频繁,或者执行时间太长,就会退化成定时删除策略,将 CPU 时间过多地消耗在删除过期键上

  • 如果删除操作执行得太少,或者执行时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况

定期删除是周期性轮询 Redis 库中的时效性数据,从过期字典中随机抽取一部分键检查,利用过期数据占比的方式控制删除频度

  • Redis 启动服务器初始化时,读取配置 server.hz 的值,默认为 10,执行指令 info server 可以查看,每秒钟执行 server.hz 次 serverCron() → activeExpireCycle()

  • activeExpireCycle() 对某个数据库中的每个 expires 进行检测,工作模式:

    • 轮询每个数据库,从数据库中取出一定数量的随机键进行检查,并删除其中的过期键,如果过期 key 的比例超过了 25%,则继续重复此过程,直到过期 key 的比例下降到 25% 以下,或者这次任务的执行耗时超过了 25 毫秒

    • 全局变量 current_db 用于记录 activeExpireCycle() 的检查进度(哪一个数据库),下一次调用时接着该进度处理

    • 随着函数的不断执行,服务器中的所有数据库都会被检查一遍,这时将 current_db 重置为 0,然后再次开始新一轮的检查

定期删除特点:

  • CPU 性能占用设置有峰值,检测频度可自定义设置

  • 内存压力不是很大,长期占用内存的冷数据会被持续清理

  • 周期性抽查存储空间(随机抽查,重点抽查)

三、内存淘汰策略

我们看到,通过过期删除策略,对于某些永远使用不到的键,并且多次定期删除也没选定到并删除,那么这些键同样会一直驻留在内存中,

又或者在Redis中存入了大量的键,这些操作可能会导致Redis内存不够用,这时候就需要Redis的内存淘汰策略了。

1、逐出算法

数据淘汰策略:当新数据进入 Redis 时,在执行每一个命令前,会调用 freeMemoryIfNeeded() 检测内存是否充足。如果内存不满足新加入数据的最低存储要求,

Redis 要临时删除一些数据为当前指令清理存储空间,清理数据的策略称为逐出算法

逐出数据的过程不是 100% 能够清理出足够的可使用的内存空间,如果不成功则反复执行,当对所有数据尝试完毕,如不能达到内存清理的要求,出现 Redis 内存打满异常:

(error) OOM command not allowed when used memory >'maxmemory'

2、策略配置

Redis 如果不设置最大内存大小或者设置最大内存大小为 0,在 64 位操作系统下不限制内存大小,在 32 位操作系统默认为 3GB 内存,一般推荐设置 Redis 内存为最大物理内存的四分之三

内存配置方式:

  • 通过修改文件配置(永久生效):修改配置文件 maxmemory 字段,单位为字节

  • 通过命令修改(重启失效):

    • config set maxmemory 104857600:设置 Redis 最大占用内存为 100MB

    • config get maxmemory:获取 Redis 最大占用内存

    • info :可以查看 Redis 内存使用情况,used_memory_human 字段表示实际已经占用的内存,maxmemory 表示最大占用内存

影响数据淘汰的相关配置如下,配置 conf 文件:

  • 每次选取待删除数据的个数,采用随机获取数据的方式作为待检测删除数据,防止全库扫描,导致严重的性能消耗,降低读写性能

    maxmemory-samples count
  • 达到最大内存后的,对被挑选出来的数据进行删除的策略

    maxmemory-policy policy

数据删除的策略 policy:3 类 8 种

第一类:检测设置过期时间的数据(可能会过期的数据集 server.db[i].expires):

  volatile-lru	# 对设置了过期时间的 key 选择最近最少使用的数据淘汰  最近最少使用的键
volatile-lfu # 对设置了过期时间的 key 选择最不常用数据淘汰
volatile-ttl # 对设置了过期时间的 key 选择将要过期的数据淘汰
volatile-random # 对设置了过期时间的 key 选择任意数据淘汰

第二类:检测全库数据(所有数据集 server.db[i].dict ):

  allkeys-lru		# 对所有 key 选择最近最少使用的数据淘汰
allkeLyRs-lfu # 对所有 key 选择最不常用的数据淘汰
allkeys-random # 对所有 key 选择任意数据淘汰,相当于随机

第三类:放弃数据驱逐

  no-enviction	# 禁止驱逐数据(redis4.0中默认策略),会引发OOM(Out Of Memory)

在redis.conf 配置文件中,可以设置淘汰方式:

Redis-过期删除策略和内存淘汰策略的更多相关文章

  1. Redis详解(十一)------ 过期删除策略和内存淘汰策略

    在介绍这篇文章之前,我们先来看如下几个问题: ①.如何设置Redis键的过期时间? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗? ③.如何设置R ...

  2. 【Redis】过期键删除策略和内存淘汰策略

    Redis 过期键策略和内存淘汰策略 目录 Redis 过期键策略和内存淘汰策略 设置Redis键过期时间 Redis过期时间的判定 过期键删除策略 定时删除 惰性删除 定期删除 Redis过期删除策 ...

  3. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  4. redis过期策略、内存淘汰策略、持久化方式、主从复制

    原文链接:https://blog.csdn.net/a745233700/article/details/85413179 一.Redis的过期策略以及内存淘汰策略:1.过期策略:定期删除+惰性删除 ...

  5. Redis的过期策略和内存淘汰策略(转)

    Redis的过期策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间.Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理. ...

  6. Redis的过期策略和内存淘汰策略

    Redis的过期策略:通常有三种,Redis中同时使用惰性过期和定期过期两种过期策略组合. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据 ...

  7. redis键的过期和内存淘汰策略

    键的过期时间 设置过期时间 Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的.我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的. 按照传统 ...

  8. 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制

    1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了过 ...

  9. Redis系列11:内存淘汰策略

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  10. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

随机推荐

  1. Linux系统用户登录命令行或执行命令显示日志文件异常-bash: /var/log/ 解决办法

    经常会遇到Linux系统用户登录命令行或执行命令显示日志文件异常,比如:-bash: /var/log/xxx_audit/xxx_audit.log: Permission denied 其实是说开 ...

  2. 从0到1构建开源 vue-uniapp-template:使用 UniApp + Vue3 + TypeScript 和 VSCoe、CLI 开发跨平台移动端脚手架

    作者主页: 有来技术 开源项目: youlai-mall︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 仓库主页: GitCode︱ Gitee ...

  3. 使用SOUI4中的STreeView控件

    STreeView控件是一个基于虚表技术实现的高性能树形控件. 和STreeCtrl这种传统的树形控件将数据和控件固定在一起不同,STreeView数据和控件分离,使用一个adapter进行连接. 用 ...

  4. 引燃算力新基建,天翼云亮相DCIC2024第13届数据中心产业发展大会!

    近日,由中国通信企业协会主办的"第13届数据中心产业发展大会暨AIDC智能算力生态合作展览会"在北京顺利举行.现场展示了天翼云"AIDC""紫金&qu ...

  5. Dummynet简单部署

    本文分享自天翼云开发者社区<Dummynet简单部署>,作者:凸凹 部署流程 ^准备内核版本 ^参看系统内核版本 uname -r 我们需要将ipfw编译成内核模块,请确保ipfw用到的内 ...

  6. [记录点滴]Spring Boot Admin源码分析笔记

    [记录点滴]Spring Boot Admin源码分析笔记 0x00 摘要 本文是过去使用Spring Boot Admin时候分析源码的笔记.虽然比较简单,但是也可以看出Spring Boot Ad ...

  7. NOIp 2024 游记

    要是 T3 T4 挂分就寄了. Day-11 运动会上 vp 了 NOIp2023 和 NOIp2022,NOIp2023 被 T2 硬控了一会,最后口胡的做法感觉可以拿 \(100+100+35+1 ...

  8. 清华博士后的DeepSeek使用手册,104页,真的是太厉害了!(免费领取源文件)

    <DeepSeek从入门到精通2025>是由清华大学元宇宙文化实验室的余梦珑博士后及其团队撰写.文档的核心内容围绕DeepSeek的技术特点.应用场景.使用方法以及如何通过提示语设计提升A ...

  9. 【忍者算法】从公路跑步到链表成环:探索环形链表检测|LeetCode第141题 环形链表

    从公路跑步到链表成环:探索环形链表检测 生活中的环形 想象两个人在环形跑道上跑步,一个跑得快,一个跑得慢.如果他们一直跑下去,快的跑者一定会从后面追上慢的跑者.这就是我们今天要讨论的环形链表问题的现实 ...

  10. element-ui中el-table多层数组渲染问题

    tableData: [ { name: '国家出资人', list: [ { name: '2011', value: '0' }, { name: '2012', value: '0' }, { ...