文章目录

  • 1、过期删除
    • 1.1、过期删除策略
      • 惰性删除
      • 定时删除
  • 2、内存淘汰
    • 2.1、内存淘汰策略

在 RedisDB 利用两个 dict 分别来记录 key-value 和 key-TTL。


对应的源码:

typedef struct redisDb {dict *dict;        // 存放 key-value,也被称为 keyspacedict *expires;     // 存放 key-TTLdict *blocking_keys;  /* Keys with clients waiting for data (BLPOP)*/dict *ready_keys;     /* Blocked keys that received a PUSH */dict *watched_keys;   /* WATCHED keys for MULTI/EXEC CAS */int id;               /* Database ID, 0~15 */   long long avg_ttl;    // 记录平均 TTL 时长unsigned long expires_cursor; // expire 检查时在 dict 中抽样的索引位置 list *defrag_later;         // 等待碎片整理的 key 列表
} redisDb;

1、过期删除

当一个 key 设置过期时间时,Reids 会把 key 和过期时间 ttl 存储到过期字典expires中.

设置 key 的过期时间的命令

# 设置 key 的过期时间
expire key seconds
pexpire key milliseconds
# 查看 key 的过期时间
ttl key
pttl key
# 对象空转时长
object idletime key

当查询一个 key 时,Redis 首先检查该 key 是否存在于过期字典中

  • 若不在,正常读取键值对
  • 若存在,获取 key 的过期时间,然后与当前系统时间比较,若比当前系统时间小,则判断 key 已过期。

当 key 过期后,需要有相应的机制将已过期的键值对删除。

1.1、过期删除策略

惰性删除

不主动删除过期 key,每次访问 key 时,都检测 key 是否过期,若过期则删除 key。

惰性删除的特点

  • 优点:将检查 key 是否过期的操作分布在每一个命令操作时,占用很少的系统资源,对 cpu 时间友好
  • 缺点:未访问的过期 key 长时间保留在内存中不会释放,造成内存空间的浪费

定时删除

定期从数据库中随机抽取一定数量的 key 检查是否过期,并删除其中的过期 key

  • 从过期字典中随机抽取 20 个 key;
  • 检查这 20 个 key 是否过期,并删除已过期的 key;
  • 如果本轮检查的已过期 key 的数量,超过 5 个(20/4),也就是「已过期 key 的数量」占比「随机抽取 key 的数量」大于 25%,则继续重复步骤 1;如果已过期的 key 比例小于 25%,则停止继续删除过期 key,然后等待下一轮再检查。

同时为了保证定期删除不会出现循环过度,导致线程卡死现象。为此增加了定期删除循环流程的时间上限,默认不会超过 25ms。

定期删除的特点

  • 优点:通过限制删除操作执行的时长和频率,减少删除操作对 cpu 的影响,同时也能删除一部分过期数据,减少了过期 key 对空间的无效占用
  • 缺点:难以确定删除操作执行的时长和频率。执行频繁对 cpu 不友好,执行太少,无法及时释放过期 key 占用的内存。

2、内存淘汰

当 Redis 内存使用达到阈值 maxmemory 时,主动挑选部分 key 删除以释放更多的内存

配置 redis.config

 maxmemory         # 访问内存上限,通常设置最大内存的一半, maxmemory-policy  # 内存淘汰策略

2.1、内存淘汰策略

过期 key 范围内淘汰

  • volatile-lru:最长时间没有使用
  • volatile-lfu:最少次数使用
  • volatile-ttl:最近要过期
  • volatile-radom:随机

淘汰所有 key 范围内淘汰

  • allkeys-lru
  • allkeys-lfu
  • allkeys-radom

禁止淘汰

  • no-evicition:达到最大内存,增加数据,报错

Redis 内存回收相关推荐

  1. Redis内存回收策略

    Redis 也会因为内存不足而产生错误,也可能因为回收过久而导致系统长期的停顿,因此掌握执行回收策略十分有必要.在 Redis 的配置文件中,当 Redis 的内存达到规定的最大值时,允许配置 6 种 ...

  2. Redis内存回收和持久化策略

    概述 Redis所有数据都存在内存中,在某些时候需要对占用的内存空间进行回收,内存回收主要分为两类,一类是key过期,一类是内存使用达到上限,触发内存淘汰. Key过期策略 要实现key过期,有几种思 ...

  3. 浅看Redis内存回收

    1.内存回收 1.1过期key回收 首先由2种方式:惰性回收和周期回收 1.11惰性删除 惰性删除是什么意思?也就是在查询时候再去删除.比方说:对于一个键值对,我们设置了ttl过期时间对吧,等到ttl ...

  4. Redis 内存回收策略

    Redis的内存回收机制主要体现在以下两个方面: 删除到达过期时间的键对象. 内存使用达到maxmemory上限时触发内存溢出控制策略. 过期删除策略 删除策略的目标:在内存占用与CPU占用之间寻找一 ...

  5. redis内存回收——过期、淘汰

    DB结构 删除策略 惰性删除 周期删除 SLOW FAST 淘汰策略 redis内存设置过大时会增加同步等操作的复杂度 DB结构 /* Redis database representation. T ...

  6. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  7. Redis的内存回收机制和数据过期淘汰策略

    本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...

  8. redis内存淘汰和持久化_REDIS的淘汰机制与持久化

    1. 理解淘汰机制 1.1. 内存回收策略 Redis内存回收机制主要体现在以下两个方面: 1. 删除到达时间的键对象. 2. 内存使用达到maxmemory上限时触发内存溢出控制策略. 1.1.1. ...

  9. 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制

    前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...

最新文章

  1. C++——运算符重载operator
  2. mysql5.6cmd中代码_Mysql5.6.22源代码安装
  3. 图像的灰度级数越多越好_数字图像处理:Reducing Gray Levels, Zooming and Shrinking
  4. 计划继续深化学习物联网系统的相关知识 目前的WiFi模块基于ESP8266
  5. 《01》ECMAScript 6 简介
  6. [转] Agile Software Development 敏捷软件开发
  7. C++ 抛出异常与传递参数的区别
  8. Windows环境与Linux环境条件宏
  9. [渝粤教育] 西南科技大学 婚姻家庭继承法 在线考试复习资料
  10. hadoop2.2.0 MapReduce求和并排序
  11. 同比增长19.1%,软银第一季度净利2542亿日元
  12. linux下包管理器
  13. CentOS6.9安装AliSQL
  14. 基于web的实验室设备管理系统
  15. 恶梦----------需求分析的漫延
  16. 计算机屏幕截图按什么键,电脑上截图按哪个键_电脑截图快捷键是什么
  17. AI仿生:人类进化新可能
  18. 【CSS】文字超过三行显示省略号...
  19. Maestro Z实时无标记细胞分析仪,评估免疫细胞治疗效价
  20. 8.12 纪中集训 Day12

热门文章

  1. element的formatter失效的解决方案
  2. C++入门学习笔记01
  3. JAVA使用jacob判断word附件是否加密
  4. Qt 禁用ComboBox下拉选项
  5. textarea 属性
  6. Rosalind第二题:将DNA转录为RNA
  7. Git版本控制管理——Git和GitHub
  8. String metric
  9. 计算机安全知识有哪些方面,计算机安全包括哪些方面
  10. [转载]使用 Apache OpenJPA 开发 EJB 3.0 应用,第 4 部分: 实体关联