Redis 的过期策略
一、过期策略
1.先区分两个概念,被动删除与主动删除
1)被动删除:key再被操作时,Redis主动检查key是否过期,过期则删除;
优劣:对CPU友好,只有CPU在被操作时删除,不浪费CPU时间;对内存不友好,如果同时大量key过期,这些key在被使用前不会被删除造成资源浪费;
2)主动删除:Redis会定期随机扫描一批设置了过期时间的key并进行删除处理;当已用内存超过最大内存maxmemory时也会触发主动清除策略;
Redis采用的是定期删除 + 懒惰删除策略。
定期删除策略
Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,默认每 100ms 进行一次过期扫描:
随机抽取 20 个 key
删除这 20 个key中过期的key
如果过期的 key 比例超过 1/4,就重复步骤 1,继续删除。
为什不扫描所有的 key?
Redis 是单线程,全部扫描岂不是卡死了。而且为了防止每次扫描过期的 key 比例都超过 1/4,导致不停循环卡死线程,Redis 为每次扫描添加了上限时间,默认是 25ms。
如果在同一时间出现大面积 key 过期,Redis 循环多次扫描过期词典,直到过期的 key 比例小于 1/4。这会导致卡顿,而且在高并发的情况下,可能会导致缓存雪崩。
从库的过期策略
从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。
因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致,主库没有的数据在从库里还存在。
懒惰删除策略
Redis 为什么要懒惰删除(lazy free)?
删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,又或者在使用 FLUSHDB 和 FLUSHALL 删除包含大量键的数据库时,那么删除操作就会导致单线程卡顿。
redis 4.0 引入了 lazyfree 的机制,它可以将删除键或数据库的操作放在后台线程里执行, 从而尽可能地避免服务器阻塞。
unlink
unlink 指令,它能对删除操作进行懒处理,丢给后台线程来异步回收内存。
> unlink key
OK
flush
flushdb 和 flushall 指令,用来清空数据库,这也是极其缓慢的操作。Redis 4.0 同样给这两个指令也带来了异步化,在指令后面增加 async 参数就可以将整棵大树连根拔起,扔给后台线程慢慢焚烧。
> flushall async
OK
异步队列
主线程将对象的引用从「大树」中摘除后,会将这个 key 的内存回收操作包装成一个任务,塞进异步任务队列,后台线程会从这个异步队列中取任务。任务队列被主线程和异步线程同时操作,所以必须是一个线程安全的队列。
不是所有的 unlink 操作都会延后处理,如果对应 key 所占用的内存很小,延后处理就没有必要了,这时候 Redis 会将对应的 key 内存立即回收,跟 del 指令一样。
二、淘汰策略
Redis 的内存占用会越来越高。Redis 为了限制最大使用内存,提供了 redis.conf 中的
配置参数 maxmemory。当内存超出 maxmemory,Redis 提供了几种内存淘汰机制让用户选择,配置 maxmemory-policy:
noeviction:当内存超出 maxmemory,写入请求会报错,但是删除和读请求可以继续。
allkeys-lru:当内存超出 maxmemory,在所有的 key 中,移除最少使用的key。只把 Redis 既当缓存是使用这种策略(推荐)。
allkeys-random:当内存超出 maxmemory,在所有的 key 中,随机移除某个 key。
volatile-lru:当内存超出 maxmemory,在设置了过期时间 key 的字典中,移除最少使用的 key。把 Redis 既当缓存,又做持久化的时候使用这种策略。
volatile-random:当内存超出 maxmemory,在设置了过期时间 key 的字典中,随机移除某个key。
volatile-ttl:当内存超出 maxmemory,在设置了过期时间 key 的字典中,优先移除 ttl 小的。
Redis 的过期策略相关推荐
- 【Redis】回顾下Redis的过期策略
CSDN话题挑战赛第2期 参赛话题:面试宝典 金九银十之际,一定有很多朋友出去面试,通过每一次的面试,都可以检查一下自己的技术能力是什么样的,所以在面试前的准备是必不可少的环节. 俗话说的好:从不打无 ...
- Redis 的过期策略是如何实现的?
背景 为了减少占用内存空间,通常会对放到 Redis 中的键通过 expire 设置一个过期时间,那 Redis 是怎么实现对过期键删除的呢? 设置过期时间 设置过期时间的四种方式 # 将 key 的 ...
- Redis缓存过期策略
转载出处链接 一.背景 线上你写代码的时候,想当然的认为写进 redis 的数据就一定会存在,后面导致系统各种 bug,谁来负责? 常见的有两个问题: 往 redis 写入的数据怎么没了? 可能有同学 ...
- Redis的过期策略以及内存淘汰机制
Redis的过期策略以及内存淘汰机制 我们知道,redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样删除过期数据的?删除过期数据的策略是什么? ...
- 谈谈 Redis 的过期策略
在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞.要搞清楚这些,就要了 ...
- 13. 谈谈 Redis 的过期策略
谈谈 Redis 的过期策略 定期删除策略 从库的过期策略 懒惰删除策略 unlink flush 异步队列 更多异步删除点 内存淘汰机制 LRU 算法 近似 LRU 算法 LFU 在日常开发中,我们 ...
- 关于Redis数据过期策略
前言 在项目中某场景下,需要频繁去设置redis数据的过期时间,因此去了解了下redis数据过期策略.原文地址:关于Redis数据过期策略 一.Redis中key的的过期时间 通过EXPIRE key ...
- 复习Java第二个项目仿QQ聊天系统 01(界面部分) Java面试题Redis的过期策略和内存淘汰策略生活【记录一个咸鱼大学生三个月的奋进生活】023
记录一个咸鱼大学生三个月的奋进生活023 复习Java(仿QQ聊天系统01界面部分) 设置背景(ImgPanel)类 登录界面(LoginFrame)类 注册界面(RegisterFrame)类 好友 ...
- redis的过期策略
Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除.你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割. 你还可以进一步站在死神的角度 ...
- Redis学习笔记--Redis数据过期策略详解==转
本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...
最新文章
- (zz)ubuntu 9.04 下无线破解
- Redux之compose
- [51nod1376] 最长递增子序列的数量
- Linux 使用本地yum源及软件包管理
- AI领域人才,做什么工作可以年薪百万?
- 第八十七期:爬了知乎“沙雕问题”,笑死个人!
- Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
- jqGrid 中的editrules来自定义colModel验证规则
- 一些难懂的笑话,看看你懂得多少? [转帖]
- Spring Boot文档阅读比较-@SpringBootApplication Auto Configuration
- 人人都能学会的python编程教程1:第一行代码
- 【AS3代码】AS调用JS
- 13.Linux 高性能服务器编程 --- 多进程编程
- 动态拼接Lambda表达式2
- Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法!
- 使用gsds绘制基因结构图_GSDS 基因结构显示系统
- LINUX IIO子系统分析之五IIO BUFFER子模块实现分析
- 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
- php simplexmlelement object 数组,php中将SimpleXMLElement Object数组转化为普通数组
- MHA与PXC的区别
热门文章
- PDF转CAD经典软件有什么
- 弱电总包施工组织设计与实施方案
- 基本计算机编程术语,计算机编程术语,你记住了吗?
- java 8 list to map_Java8中list转map
- js将html替换字符串,js 替换字符串指定内容 javascript 替换指定位置的字符
- 基于springboot+mysql毕业设计,会议室预约系统
- linux raid 卡日志,Linux系统下RAID卡异常日志收集方法、系统及存储介质与流程
- Microsoft365 与 visio2016 共存
- 问题解决-Visio2016和Office不能并行
- python凹多边形分割_凹多边形拆分