【Redis】Redis 内存回收

news2024/10/7 12:25:15

文章目录

  • 1. 过期key处理
    • 1.1 惰性删除
    • 1.2 周期删除
  • 2. 内存淘汰策略


在这里插入图片描述

Redis 中数据过期策略采用定期删除+惰性删除策略结合起来,以及采用淘汰策略来兜底。

定期删除策略:Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。

惰性删除策略:在获取 key 时,先判断 key 是否过期,如果过期则删除。这种方式存在一个缺点:如果这个 key 一直未被使用,那么它一直在内存中,其实它已经过期了,会浪费大量的空间。

这两种策略天然的互补,结合起来之后,定时删除策略就发生了一些改变,不在是每次扫描全部的 key 了,而是随机抽取一部分 key 进行检查,这样就降低了对 CPU 资源的损耗,惰性删除策略互补了为检查到的key,基本上满足了所有要求。但是有时候就是那么的巧,既没有被定时器抽取到,又没有被使用,这些数据又如何从内存中消失?没关系,还有内存淘汰机制,当内存不够用时,内存淘汰机制就会上场。

内存淘汰机制
内存淘汰机制就保证了在redis的内存占用过多的时候,去进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高。

redis 提供 6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机移除key
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据,一般不采用
4.0版本后增加以下两种:
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key


1. 过期key处理

Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。我们可以通过修改配置文件来设置Redis的最大内存:
1653983341150.png
当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis提供了一些策略实现内存回收:
内存过期策略
在学习Redis缓存的时候我们说过,可以通过expire命令给Redis的key设置TTL(存活时间):
1653983366243.png

可以发现,当key的TTL到期以后,再次访问name返回的是nil,说明这个key已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。
Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中,有两个Dict:一个用来记录key-value;另一个用来记录key-TTL。

这里有两个问题需要我们思考:Redis是如何知道一个key是否过期呢?
利用两个Dict分别记录key-value对及key-ttl对
是不是TTL到期就立即删除了呢?

1.1 惰性删除

惰性删除:顾明思议并不是在TTL到期后就立刻删除,而是在访问一个key的时候,检查该key的存活时间,如果已经过期才执行删除。
1653983652865.png

1.2 周期删除

周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:
Redis服务初始化函数initServer()中设置定时任务,按照server.hz的频率来执行过期key清理,模式为SLOW
Redis的每个事件循环前会调用beforeSleep()函数,执行过期key清理,模式为FAST

周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。执行周期有两种:
Redis服务初始化函数initServer()中设置定时任务,按照server.hz的频率来执行过期key清理,模式为SLOW
Redis的每个事件循环前会调用beforeSleep()函数,执行过期key清理,模式为FAST

SLOW模式规则:

  • 执行频率受server.hz影响,默认为10,即每秒执行10次,每个执行周期100ms。
  • 执行清理耗时不超过一次执行周期的25%.默认slow模式耗时不超过25ms
  • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
  • 如果没达到时间上限(25ms)并且过期key比例大于10%,再进行一次抽样,否则结束
  • FAST模式规则(过期key比例小于10%不执行 ):
  • 执行频率受beforeSleep()调用频率影响,但两次FAST模式间隔不低于2ms
  • 执行清理耗时不超过1ms
  • 逐个遍历db,逐个遍历db中的bucket,抽取20个key判断是否过期
    如果没达到时间上限(1ms)并且过期key比例大于10%,再进行一次抽样,否则结束

小总结:
RedisKey的TTL记录方式:
在RedisDB中通过一个Dict记录每个Key的TTL时间
过期key的删除策略:
惰性清理:每次查找key时判断是否过期,如果过期则删除
定期清理:定期抽样部分key,判断是否过期,如果过期则删除。
定期清理的两种模式:
SLOW模式执行频率默认为10,每次不超过25ms
FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

2. 内存淘汰策略

内存淘汰:就是当Redis内存使用达到设置的上限时,主动挑选部分key删除以释放更多内存的流程。Redis会在处理客户端命令的方法processCommand()中尝试做内存淘汰:1653983978671.png

淘汰策略
Redis支持8种不同策略来选择要删除的key:

  • noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略(不推荐使用)
  • volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
  • allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
  • volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
  • allkeys-lru: 对全体key,基于LRU算法进行淘汰
  • volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
  • allkeys-lfu: 对全体key,基于LFU算法进行淘汰
  • volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰比较容易混淆的有两个:
    • LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
    • LFU(Least Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型技术原理

在今天这个时代,人们的工作和生活已经离不开数据访问,而几乎所有平台背后的数据存储和查询都离不开数据库。SQL作为一种数据库的查询和处理语言历史悠久,最早由IBM于上世纪70年代初研究关系数据模型时提出,后续发展为一种广泛使用…

Python实战基础15-匿名函数,高阶函数

1、匿名函数 用lambda关键词能创建小型匿名函数,这种函数得名于省略了用def声明函数的标准步骤。 lambda函数的语法只包含一个语句,如下: lambda 参数列表: 运算表达式 如下实例: sum lambda arg1,arg2:arg1 arg2…

Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial

未完待续。。。。。 5.1 基本操作 参考视频: 5 - 1 - Basic Operations (14 控制输出格式的长短 min).mkv 5.1.1 简单运算 不等于符号的写法是这个波浪线加上等于符号 ( ~ ),而不是等于感叹号加等号( ! ) 1 1 1   % 判断相等 2 1 ~ 2   % 判断不等 3 …

【AUTOSAR】Com通讯栈配置说明(一)---- Can模块

通讯栈 模块 项目通讯栈 主要包含如下几个模块: 各模块详细配置说明 Can模块 这部分最终会导入到EB 中,通过EB 生成CanDriver 代码, 具体参数的介绍已经在EB 配置说明中介绍过。 CanController ​​​​​​​CanHaredWareObject 以其中一…

Unity3D:2D/3D 项目

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 2D 还是 3D 项目 无论是创建 2D 还是 3D 游戏,Unity 都很拿手。在 Unity 中创建新项目时,可以选择以 2D 或 3D 模式启动。您可能已经知道要构建什么&#x…

1-网络初识——网络发展史

目录 1.独立模式 2.网络互联 2.1.局域网(Local Area Network,简称LAN) ①基于网线直连 ②基于集线器组建 ③基于交换机组建 ④基于交换机(网口很多)和路由器组建 2.2.广域网(Wide Area Network&…

MySQL新身份验证插件caching_sha2_password

同事反馈了一个问题,MySQL客户端连接数据库的时候,提示这个错误, ERROR 2059 (HY000): Plugin caching_sha2_password could not be loaded: /usr/lib64/mariadb/plugin/caching_sha2_password.so: cannot open shared object file: No suc…

中国码农生存现状调查

传说中的码农到底是一种什么样的存在。 程序员一直都是一个备受人们关注的群体。据IDC统计,全球约有1850万名程序员,中国占10%。随着近年全国互联网创业热潮的兴起,“互联网”、“云计算”以及“智能硬件”等领域发展迅速,市场对…

微信小程序开发需要多少钱?

近几年来,微信小程序开发行业发展迅猛,可以说是未来的一个趋势,它不仅能在用户体验上更好,而且也能有效地提升商家的营业额。目前来说,小程序开发主要有模板小程序、定制小程序两种,模板小程序的价格比较低…

IO多路复用详解

文章目录 基本概念select系统调用详解select函数定义select的底层原理select的优缺点 poll系统调用详解poll函数定义调用poll的底层原理poll的优缺点 epoll系统调用详解epoll相关的函数定义epoll的底层原理epoll的优缺点 ET vs LT基本概念epoll_ctl模式设置 应用场景基于IO多路…

Makefile中定义版本号,巨坑

最初是这样定义的,咋看没问题 DT_VERSION 5.1.0 ifeq ($(shell which git), )DT_BACKEND_VERSION $(DT_VERSION) elseDATE $(shell date "%m/%d/%Y")GIT_VERSION $(shell git rev-parse HEAD | cut -c 1-8)DT_BACKEND_VERSION $(DT_VERSION)-$(GIT_…

基于 Log 的通用增量 Checkpoint

摘要:本文整理自阿里巴巴开发工程师,Apache Flink Contributor 俞航翔,在 Flink Forward Asia 2022 核心技术专场的分享。本篇内容主要分为四个部分: 1. Checkpoint 性能优化之路 2. Changelog 机制解析 3. Changelog 性能测试 4.…

使用Windows程序包管理器winget安装卸载更新软件

什么是 Windows 程序包管理器? Winget是一个命令行工具,是Windows 系统中用于自动安装、升级和配置软件的系统包管理工具。 Windows 程序包管理器是一个综合性的程序包管理器解决方案,它由一个命令行工具以及一组用于安装应用程序的服务组成…

缓存更新的四种策略及选取建议

文章目录 缓存更新的四种策略及选取建议前言Cache AsideCache Aside查询策略Cache Aside更新策略延迟双删 Read/Write ThroughRead/Write Through查询策略Read/Write Through更新策略 Write BehindRefresh-AheadCDC 四种策略的选择性能数据一致性冗余数据代码复杂度业务逻辑可靠…

高精度倾角传感器测量原理

高精度倾角传感器测量原理技术参数 1.性能参数 测量范围:0~30 测量精度:0.06 分 辨 率:0.0001 测量方向:X,Y 时间漂移:0.08/月 更新时间:30ms 上电启动时间:0.5s 2.电…

全网首发 | 广州虚拟动力最新版兼具动捕与面捕功能的动作捕捉系统

随着多项政策明确提出 未来将大力推进虚拟现实与文娱互动 影视艺术等新兴前沿领域的创新与产业化 动作捕捉作为联结虚实世界的桥梁 影响着3D动画以及文娱互动产业的数字化发展 行业痛点 •光学动捕系统成本昂贵:难以下沉到项目预算和运营预算,不利于…

CentOS 安装配置 vncserver

1. VNC 简介 VNC(Virtual Network Computing) 是使用网络建立连接的一个虚拟桌面,用来远程操作计算机的一种技术,日常会有很多中场景需要远程来控制和操作服务器等计算机。 2. CentOS 安装 VNC Server 使用 yum 安装 tigervnc-server。 sudo yum ins…

PG案例系列1:优化大表的count(*)

文章目录 一. 问题描述二. 解决方案2.1 收集统计信息2.2 并行2.3 autovacuum2.3 统计信息读取 参考: 一. 问题描述 前端页面需要分页展示,经常需要查询总数,然后做分页展示。 遇到的问题是,第一次执行会很慢,6秒左右&#xff0c…

C++数据结构:二叉树之一(数组存储)

文章目录 前言一、二叉树的基本定义二、二叉树的基本性质三、二叉树的存储(数组)总结原创文章,未经许可,禁止转载 前言 树是一种非线性数据结构,它由若干个节点和边组成。每个节点都有一个值,而边则表示节…

2核4G5M性能测评:腾讯云轻量应用服务器CPU内存带宽系统盘

腾讯云轻量应用服务器2核4G5M配置一年168元,三年628元,100%CPU性能,5M带宽下载速度640KB/秒,60GB SSD系统盘,月流量500GB,折合每天16.6GB流量,超出月流量包的流量按照0.8元每GB的支付流量费&…