Redis 内存回收
文章目录
- 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 内存回收相关推荐
- Redis内存回收策略
Redis 也会因为内存不足而产生错误,也可能因为回收过久而导致系统长期的停顿,因此掌握执行回收策略十分有必要.在 Redis 的配置文件中,当 Redis 的内存达到规定的最大值时,允许配置 6 种 ...
- Redis内存回收和持久化策略
概述 Redis所有数据都存在内存中,在某些时候需要对占用的内存空间进行回收,内存回收主要分为两类,一类是key过期,一类是内存使用达到上限,触发内存淘汰. Key过期策略 要实现key过期,有几种思 ...
- 浅看Redis内存回收
1.内存回收 1.1过期key回收 首先由2种方式:惰性回收和周期回收 1.11惰性删除 惰性删除是什么意思?也就是在查询时候再去删除.比方说:对于一个键值对,我们设置了ttl过期时间对吧,等到ttl ...
- Redis 内存回收策略
Redis的内存回收机制主要体现在以下两个方面: 删除到达过期时间的键对象. 内存使用达到maxmemory上限时触发内存溢出控制策略. 过期删除策略 删除策略的目标:在内存占用与CPU占用之间寻找一 ...
- redis内存回收——过期、淘汰
DB结构 删除策略 惰性删除 周期删除 SLOW FAST 淘汰策略 redis内存设置过大时会增加同步等操作的复杂度 DB结构 /* Redis database representation. T ...
- Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解
Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...
- Redis的内存回收机制和数据过期淘汰策略
本文来说下Redis的内存回收机制和数据过期淘汰策略 文章目录 概述 为什么需要内存回收 过期删除策略 定时删除 惰性删除 定期删除 删除策略比对 过期删除策略原理 redisDb结构体定义 expi ...
- redis内存淘汰和持久化_REDIS的淘汰机制与持久化
1. 理解淘汰机制 1.1. 内存回收策略 Redis内存回收机制主要体现在以下两个方面: 1. 删除到达时间的键对象. 2. 内存使用达到maxmemory上限时触发内存溢出控制策略. 1.1.1. ...
- 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制
前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...
最新文章
- C++——运算符重载operator
- mysql5.6cmd中代码_Mysql5.6.22源代码安装
- 图像的灰度级数越多越好_数字图像处理:Reducing Gray Levels, Zooming and Shrinking
- 计划继续深化学习物联网系统的相关知识 目前的WiFi模块基于ESP8266
- 《01》ECMAScript 6 简介
- [转] Agile Software Development 敏捷软件开发
- C++ 抛出异常与传递参数的区别
- Windows环境与Linux环境条件宏
- [渝粤教育] 西南科技大学 婚姻家庭继承法 在线考试复习资料
- hadoop2.2.0 MapReduce求和并排序
- 同比增长19.1%,软银第一季度净利2542亿日元
- linux下包管理器
- CentOS6.9安装AliSQL
- 基于web的实验室设备管理系统
- 恶梦----------需求分析的漫延
- 计算机屏幕截图按什么键,电脑上截图按哪个键_电脑截图快捷键是什么
- AI仿生:人类进化新可能
- 【CSS】文字超过三行显示省略号...
- Maestro Z实时无标记细胞分析仪,评估免疫细胞治疗效价
- 8.12 纪中集训 Day12