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

你还可以进一步站在死神的角度思考,会不会因为同一时间太多的 key 过期,以至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。

过期的 key 集合

redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。

定时扫描策略

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是 采用了一种简单的贪心策略。

1、从过期字典中随机 20 个 key;

2、删除这 20 个 key 中已经过期的 key;

3、如果过期的 key 比率超过 1/4,那就重复步骤 1;

同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

设想一个大型的 Redis 实例中所有的 key 在同一时间过期了,会出现怎样的结果?

毫无疑问,Redis 会持续扫描过期字典 (循环多次),直到过期字典中过期的 key 变得稀疏,才会停止 (循环次数明显下降)。这就会导致线上读写请求出现明显的卡顿现象。导致这 种卡顿的另外一种原因是内存管理器需要频繁回收内存页,这也会产生一定的 CPU 消耗。

也许你会争辩说“扫描不是有 25ms 的时间上限了么,怎么会导致卡顿呢”?这里打个 比方,假如有 101 个客户端同时将请求发过来了,然后前 100 个请求的执行时间都是 25ms,那么第 101 个指令需要等待多久才能执行?2500ms,这个就是客户端的卡顿时间, 是由服务器不间断的小卡顿积少成多导致的。

所以业务开发人员一定要注意过期时间,如果有大批量的 key 过期,要给过期时间设置 一个随机范围,而不能全部在同一时间过期。

# 在目标过期时间上增加一天的随机时间
redis.expire_at(key, random.randint(86400) + expire_ts)

在一些活动系统中,因为活动是一期一会,下一期活动举办时,前面几期的很多数据都可以丢弃了,所以需要给相关的活动数据设置一个过期时间,以减少不必要的 Redis 内存占用。如果不加注意,你可能会将过期时间设置为活动结束时间再增加一个常量的冗余时间, 如果参与活动的人数太多,就会导致大量的 key 同时过期。

从库的过期策略

从库不会进行过期扫描,从库对过期的处理是被动的。主库在 key 到期时,会在 AOF 文件里增加一条 del 指令,同步到所有的从库,从库通过执行这条 del 指令来删除过期的 key。

因为指令同步是异步进行的,所以主库过期的 key 的 del 指令没有及时同步到从库的话,会出现主从数据的不一致,主库没有的数据在从库里还存在。

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

最新文章

  1. 分布式系统理论基础,以及选举,多数派,租约
  2. 计算机网络 实验教案,《计算机网络》实验教案.pdf
  3. 鼠标问题:鼠标拖拽不灵敏,准备复制拖动的半截就断了
  4. 1908元?iPhone SE 3价格大幅下调,网友:这个价格我冲了
  5. 使用 Commander 写自己的 Nodejs 命令
  6. 移动端布局:视口viewport的理解
  7. tar 打包、压缩和备份
  8. 牛客——数据库实战(31~61)
  9. web应用转化为saas多租户
  10. ios 设置字体家族
  11. 缓和曲线回头曲线交点法坐标计算实例
  12. 07-20210305在WIN10下通过USB口给华为海思Hi3516DV300刷机(鸿蒙系统)
  13. Spring Web : FormHttpMessageConverter
  14. 【转】Python实现量化选股
  15. 边缘计算:新瓶装旧酒?
  16. 不要忘了我们心中的梦
  17. 【安全牛学习笔记】POP3
  18. 华为eNSP配置DHCP服务
  19. P3406 海底高铁
  20. InDesign 教程:如何编辑段落样式?

热门文章

  1. 设计模式--迭代器(Iterator)模式
  2. python网络编程—TCP协议(二)
  3. [ARM异常]-armv8/armv9同步异常的介绍
  4. linux kernel的问与答
  5. 关闭生成调试信息和嵌入清单
  6. linux编译llvm代码
  7. 修改xp boot.ini文件
  8. *ctf box题解
  9. Windows保护模式学习笔记(十二)—— 控制寄存器
  10. 【Laravel Cache】 配置redis 存储缓存,通俗易懂,一次就掌握