一、过期策略

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 的过期策略相关推荐

  1. 【Redis】回顾下Redis的过期策略

    CSDN话题挑战赛第2期 参赛话题:面试宝典 金九银十之际,一定有很多朋友出去面试,通过每一次的面试,都可以检查一下自己的技术能力是什么样的,所以在面试前的准备是必不可少的环节. 俗话说的好:从不打无 ...

  2. Redis 的过期策略是如何实现的?

    背景 为了减少占用内存空间,通常会对放到 Redis 中的键通过 expire 设置一个过期时间,那 Redis 是怎么实现对过期键删除的呢? 设置过期时间 设置过期时间的四种方式 # 将 key 的 ...

  3. Redis缓存过期策略

    转载出处链接 一.背景 线上你写代码的时候,想当然的认为写进 redis 的数据就一定会存在,后面导致系统各种 bug,谁来负责? 常见的有两个问题: 往 redis 写入的数据怎么没了? 可能有同学 ...

  4. Redis的过期策略以及内存淘汰机制

    Redis的过期策略以及内存淘汰机制 我们知道,redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样删除过期数据的?删除过期数据的策略是什么? ...

  5. 谈谈 Redis 的过期策略

    在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞.要搞清楚这些,就要了 ...

  6. 13. 谈谈 Redis 的过期策略

    谈谈 Redis 的过期策略 定期删除策略 从库的过期策略 懒惰删除策略 unlink flush 异步队列 更多异步删除点 内存淘汰机制 LRU 算法 近似 LRU 算法 LFU 在日常开发中,我们 ...

  7. 关于Redis数据过期策略

    前言 在项目中某场景下,需要频繁去设置redis数据的过期时间,因此去了解了下redis数据过期策略.原文地址:关于Redis数据过期策略 一.Redis中key的的过期时间 通过EXPIRE key ...

  8. 复习Java第二个项目仿QQ聊天系统 01(界面部分) Java面试题Redis的过期策略和内存淘汰策略生活【记录一个咸鱼大学生三个月的奋进生活】023

    记录一个咸鱼大学生三个月的奋进生活023 复习Java(仿QQ聊天系统01界面部分) 设置背景(ImgPanel)类 登录界面(LoginFrame)类 注册界面(RegisterFrame)类 好友 ...

  9. redis的过期策略

    Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除.你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割. 你还可以进一步站在死神的角度 ...

  10. Redis学习笔记--Redis数据过期策略详解==转

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

最新文章

  1. (zz)ubuntu 9.04 下无线破解
  2. Redux之compose
  3. [51nod1376] 最长递增子序列的数量
  4. Linux 使用本地yum源及软件包管理
  5. AI领域人才,做什么工作可以年薪百万?
  6. 第八十七期:爬了知乎“沙雕问题”,笑死个人!
  7. Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
  8. jqGrid 中的editrules来自定义colModel验证规则
  9. 一些难懂的笑话,看看你懂得多少? [转帖]
  10. Spring Boot文档阅读比较-@SpringBootApplication Auto Configuration
  11. 人人都能学会的python编程教程1:第一行代码
  12. 【AS3代码】AS调用JS
  13. 13.Linux 高性能服务器编程 --- 多进程编程
  14. 动态拼接Lambda表达式2
  15. Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法!
  16. 使用gsds绘制基因结构图_GSDS 基因结构显示系统
  17. LINUX IIO子系统分析之五IIO BUFFER子模块实现分析
  18. 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
  19. php simplexmlelement object 数组,php中将SimpleXMLElement Object数组转化为普通数组
  20. MHA与PXC的区别

热门文章

  1. PDF转CAD经典软件有什么
  2. 弱电总包施工组织设计与实施方案
  3. 基本计算机编程术语,计算机编程术语,你记住了吗?
  4. java 8 list to map_Java8中list转map
  5. js将html替换字符串,js 替换字符串指定内容 javascript 替换指定位置的字符
  6. 基于springboot+mysql毕业设计,会议室预约系统
  7. linux raid 卡日志,Linux系统下RAID卡异常日志收集方法、系统及存储介质与流程
  8. Microsoft365 与 visio2016 共存
  9. 问题解决-Visio2016和Office不能并行
  10. python凹多边形分割_凹多边形拆分