oracle定时器定时删除30天前的数据_Redis的过期键删除策略
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,
因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?
1. 常见的删除策略
常见的删除策略有以下3种:
- 定时删除 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
- 惰性删除 放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
- 定期删除 每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。
其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略。
接下来我们一一讲解。
1.1 定时删除策略
定时删除策略通过使用定时器,定时删除策略可以保证过期键尽可能快地被删除,并释放过期键占用的内存。
因此,定时删除策略的优缺点如下所示:
- 优点:对内存非常友好
- 缺点:对CPU时间非常不友好
举个例子,如果有大量的命令请求等待服务器处理,并且服务器当前不缺少内存,如果服务器将大量的CPU时间用来删除过期键,那么服务器的响应时间和吞吐量就会受到影响。
也就是说,如果服务器创建大量的定时器,服务器处理命令请求的性能就会降低,
因此Redis目前并没有使用定时删除策略。
1.2 惰性删除策略
惰性删除策略只会在获取键时才对键进行过期检查,不会在删除其它无关的过期键花费过多的CPU时间。
因此,惰性删除策略的优缺点如下所示:
- 优点:对CPU时间非常友好
- 缺点:对内存非常不友好
举个例子,如果数据库有很多的过期键,而这些过期键又恰好一直没有被访问到,那这些过期键就会一直占用着宝贵的内存资源,造成资源浪费。
1.3 定期删除策略
定期删除策略是定时删除策略和惰性删除策略的一种整合折中方案。
定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。
2. Redis使用的过期键删除策略
Redis服务器使用的是惰性删除策略和定期删除策略。
2.1 惰性删除策略的实现
过期键的惰性删除策略由expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
- 如果输入键已经过期,那么将输入键从数据库中删除
- 如果输入键未过期,那么不做任何处理
以上描述可以使用如下流程图表示:
2.2 定期删除策略的实现
过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。
activeExpireCycle函数的大体流程为:
函数每次运行时,都从一定数量的数据库中随机取出一定数量的键进行检查,并删除其中的过期键,比如先从0号数据库开始检查,下次函数运行时,可能就是从1号数据库开始检查,直到15号数据库检查完毕,又重新从0号数据库开始检查,这样可以保证每个数据库都被检查到。
划重点:
关于定期删除的大体流程,最近面试时有被问道,我就是按上述描述回答的。 可能有的面试官还会问,每次随机删除哪些key呢?可以提下LRU算法(Least Recently Used 最近最少使用),一般不会再细问,不过有兴趣的同学可以深入研究下。
3. RDB对过期键的处理
3.1 生成RDB文件
在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。
举个例子,如果数据库中包含3个键k1、k2、k3,并且k2已经过期,那么创建新的RDB文件时,程序只会将k1和k3保存到RDB文件中,k2则会被忽略。
3.2 载入RDB文件
在启动Redis服务器时,如果服务器只开启了RDB持久化,那么服务器将会载入RDB文件:
- 如果服务器以主服务器模式运行,在载入RDB文件时,程序会对文件中保存的键进行检查,未过期的键会被载入到数据库中,过期键会被忽略。
- 如果服务器以从服务器模式运行,在载入RDB文件时,文件中保存的所有键,不论是否过期,都会被载入到数据库中。 因为主从服务器在进行数据同步(完整重同步)的时候,从服务器的数据库会被清空,所以一般情况下,过期键对载入RDB文件的从服务器不会造成影响。
4. AOF对过期键的处理
4.1 AOF文件写入
如果数据库中的某个键已经过期,并且服务器开启了AOF持久化功能,当过期键被惰性删除或者定期删除后,程序会向AOF文件追加一条DEL命令,显示记录该键已被删除。
举个例子,如果客户端执行命令GET message访问已经过期的message键,那么服务器将执行以下3个动作:
- 从数据库中删除message键
- 追加一条DEL message命令到AOF文件
- 向执行GET message命令的客户端返回空回复
4.2 AOF文件重写
在执行AOF文件重写时,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。
5. 复制功能对过期键的处理
在主从复制模式下,从服务器的过期键删除动作由主服务器控制:
- 主服务器在删除一个过期键后,会显式地向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键。
- 从服务器在执行客户端发送的读命令时,即使发现该键已过期也不会删除该键,照常返回该键的值。
- 从服务器只有接收到主服务器发送的DEL命令后,才会删除过期键。
作者:申城异乡人
链接:https://juejin.im/post/5e93ce3be51d45470d528262
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
oracle定时器定时删除30天前的数据_Redis的过期键删除策略相关推荐
- oracle定时器定时删除30天前的数据_Redis-数据淘汰策略持久化方式(RDB/AOF)Redis与Memcached区别...
Redis与Memcached区别: 两者都是非关系型数据库.主要有以下不同: 数据类型: Memcached仅支持字符串类型. redis支持:String,List,set,zset,hash 可 ...
- oracle定时器定时删除30天前的数据_使用 TDengine 存储能耗数据并通过钉钉机器人接收报警信息...
小 T 导读:福建中海创集团(FUJIAN HISTRON)始创于1992年,是一家专业从事综合智能服务的大型企业集团.基于多年打造的"工业4.0"的核心技术.商业模式与产业链体系 ...
- linux自动删除30天前的日志文件
linux应用总结: 自动删除n天前的日志文件: 1. 使用的命令格式如下:find 对应目录 -mtime +天数 -name "文件名" -exec -rm -rffind / ...
- 使用zabbix如何自动清理30天前的数据
zabbix属于一个细度化的监控工具,其入库数据随着细度的增加相应的入库数据量也会较大,当数据量到一定时候的时候其反映速度会比较慢,尽管其监控服务在配置时可以指定数据的保存周期, 但是了解下通过直接操 ...
- Redis 过期键删除策略、内存淘汰机制
文章目录 过期键删除策略 定时删除 惰性删除 定期删除 Redis的选择 内存淘汰机制 redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样怎 ...
- Redis的过期键删除策略和内存淘汰机制
一.过期键的判定 通过过期字典,程序可以用以下步骤检查一个给定键的过期时间: (1)检查给定键是否存在于过期字典:如果存在就取出来过期时间: (2)检查当前的UNIX时间戳是否大于键的过期时间,如果是 ...
- Redis系列(五):Redis的过期键删除策略
Redis系列(五):Redis的过期键删除策略 - 申城异乡人 - 博客园 本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis ...
- Redis之过期键删除策略
(一)关于键的过期时间或生存时间 我们知道,Redis数据库是基于内存的,但是如果一些不用的键在内存中一直存在,那么久而久之,就有可能会发生oom的情况.所以,redis数据库提供了常用的EXPI ...
- redis的过期键删除策略
Redis 中 key 的过期删除策略 Redis 中提供了三种过期删除的策略 1.定时删除 在设置某个 key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的 ...
最新文章
- 用FDISK进行硬盘分区
- Unity3D 多平台 预编译 宏定义
- Linux|UNIX下LAMP环境的搭建及常见问题[连载4]
- Hystrix文档-实现原理
- 大型互联网公司架构演进之路汇总
- Tensorflow2.0 tf.function和AutoGraph模式
- java spring 多数据库_java – 使用多个数据源/数据库的Spring-Hibernate
- 完成计算机组装工艺卡组装准备,计算机组装与维护(刘猛)教程方案.doc
- python----设置默认编码
- 微信小程序button修改边框样式after
- 时寒冰说经济大棋局我们怎么办_女王的棋局:艺术才华是闯天下的最佳武器
- java 往数组增加一个元素
- java.sql.SQLException: Invalid utf8 character string: 'ACED00'
- Android 免root抓包
- Redis缓存雪崩与解决方案
- LINUX下Socket编程 函数格式详解
- 第三方登陆——QQ登陆详解
- 千锋深圳python培训
- 企业为什么要申报高新技术企业
- 嵌入式Qt-实现两个窗口的切换
热门文章
- Jenkins构建项目,JAVA_HOME is not defined correctly
- golang错误处理机制(异常处理)
- Python3 字符串拼接
- solr中的ik分词器的原理是什么
- JVM 调优实战--什么是调优及如何调优的思路
- MySQL最后一次查询耗时查询
- Java集合常见数据结构-栈/队列/数组/链表/红黑树
- latex调整caption图表标题行间距、字体大小、左对齐
- Spring Initializr创建项目,利用阿里云URL解决Initialization failed for https://start.spring.io Please check URL
- 富满电子鸿蒙系统,电子行业周报:HARMONYOS+2.0助力AIOT生态体系发展