Redis 内存策略

一、Redis 内存回收

        Redis 之所以性能强,最主要的原因就是基于内存存储。然而单节点的 Redis 其内存大小不宜过大,会影响持久化或主从同步性能。

        我们可以通过修改配置文件来设置 Redis 的最大内存:

# 格式:
# maxmemory <bytes>

# 例如:
maxmemory 1gb

        当内存使用达到上限时,就无法存储更多数据了。为了解决这个问题,Redis 提供了一些策略实现内存回收:内存过期策略和内存淘汰策略。

二、过期策略

        在学习 Redis 缓存的时候我们说过,可以通过 expire 命令给 Redis key 设置 TTL(存活时间):

        可以发现,当 key TTL 到期以后,再次访问 name 返回的是 nil,说明这个 key 已经不存在了,对应的内存也得到释放。从而起到内存回收的目的。 

        这里有两个问题需要我们思考:Redis 是如何知道一个 key 是否过期呢?是不是 TTL 到期就立即删除了呢?

2.1 DB 结构

        Redis 本身是一个典型的 key-value 内存存储数据库,因此所有的 keyvalue 都保存在之前学习过的 Dict 结构中。不过在其 database 结构体中,有两个 Dict:一个用来记录 key-value;另一个用来记录 key-TTL。其结构体如下图所示:

        所以 Redis 是利用两个 Dict 分别记录 key-value 对及 key-ttl 对来知道 key 是否过期了。

        是不是 TTL 到期就立即删除了呢,当然不是,还要经历惰性删除和周期删除两个阶段。

2.2 惰性删除

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

2.3 周期删除

        周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的 key,然后执行删除。执行周期有两种模式,分别为 SLOW 模式和 FAST 模式。

         SLOW 模式:Redis 服务初始化函数 initServer() 中设置定时任务,按照 server.hz 的频率来执行过期 key 清理,模式为 SLOW

        FAST 模式:Redis 的每个事件循环前会调用 beforeSleep() 函数,执行过期 key 清理,模式为 FAST

2.3.1 SLOW 模式规则

        1、执行频率受 server.hz 影响,默认为 10,即每秒执行 10 次,每个执行周期 100ms

        2、执行清理耗时不超过一次执行周期的 25%.默认 slow 模式耗时不超过 25ms

        3、逐个遍历 db,逐个遍历 db 中的 bucket,抽取 20 key 判断是否过期

        4、如果没达到时间上限(25ms)并且过期 key 比例大于 10%,再进行一次抽样,否则结束

2.3.2 FAST 模式规则

过期 key 比例小于 10% 不执行

        1、执行频率受 beforeSleep() 调用频率影响,但两次 FAST 模式间隔不低于 2ms

        2、执行清理耗时不超过 1ms

        3、逐个遍历 db,逐个遍历 db 中的 bucket,抽取 20 key 判断是否过期

        4、如果没达到时间上限(1ms)并且过期 key 比例大于 10%,再进行一次抽样,否则结束。

2.4 小结

RedisKey TTL 记录方式:

        1、RedisDB 中通过一个 Dict 记录每个 Key TTL 时间

过期 key 的删除策略:

        1、惰性清理:每次查找 key 时判断是否过期,如果过期则删除

        2、定期清理:定期抽样部分 key,判断是否过期,如果过期则删除。

定期清理的两种模式:

        1、SLOW 模式执行频率默认为 10,每次不超过 25ms

        2、FAST 模式执行频率不固定,但两次间隔不低于 2ms,每次耗时不超过 1ms

三、淘汰策略

        我们上一小节学习了 redis 的过期策略,但是这种方式只能将过期的 key 给它移除。但是在一些庞大的项目上,数据量非常的多。很有可能仅仅淘汰过期的 key,也难以满足内存的使用。内存也有可能达到上限。此时就需要内存淘汰策略了。

3.1 内存淘汰

        就是当 Redis 内存使用达到设置的上限时,主动挑选部分 key 删除以释放更多内存的流程。

         只要有任何的命令写入,redis 都会检查内存是否够用,只要不够都会去清理内存,如下代码,Redis 会在处理客户端命令的方法 processCommand() 中尝试做内存淘汰:

int processCommand(client *c) {
    // 如果服务器设置了server.maxmemory属性,并且没有执行lua脚本
    if (server.maxmemory && !server.lua_timedout) {
        // 尝试进行内存淘汰performEvictions
        int out_of_memory = (performEvictions() == EVICT_FAIL);
        // ...
        if (out_of_memory && reject_cmd_on_oom) {
            rejectCommand(c, shared.oomerr);
            return C_OK;
        }
        // ....
    }
}

3.2 淘汰策略

        Redis 支持 8 种不同策略来选择要删除的 key,我们也可以修改配置文件来设置不同的策略,设置的位置如下图所示:

        1、noeviction: 不淘汰任何 key,但是内存满时不允许写入新数据,会报错,默认就是这种策略。

        2、volatile-ttl: 对设置了 TTL key,比较 key 的剩余 TTL 值,TTL 越小越先被淘汰。

        3、allkeys-random:对全体 key ,随机进行淘汰。也就是直接从 db->dict 中随机挑选。

        4、volatile-random:对设置了 TTL key ,随机进行淘汰。也就是从 db->expires 中随机挑选。

        5、allkeys-lru: 对全体 key,基于 LRU 算法进行淘汰。

        6、volatile-lru: 对设置了 TTLkey,基于 LRU 算法进行淘汰。

        7、allkeys-lfu: 对全体 key,基于 LFU 算法进行淘汰。

        8、volatile-lfu: 对设置了 TTL key,基于 LFU 算法进行淘汰。

比较容易混淆的有两个:

        LRULeast Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

        LFULeast Frequently Used),最少频率使用。会统计每个 key 的访问频率,值越小淘汰优先级越高。

3.3 整体流程图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高等数学笔记(二):极限

一、数列极限的定义 以下符号表示 “对于任意给定的” 以下符号表示 “存在” 以下符号表示 “如果什么&#xff08;箭头左&#xff09;&#xff0c;则什么&#xff08;箭头右&#xff09;” 二、收敛数列的性质 2.1 唯一性 2.2 有界性 2.3 保号性 2.4 子数列收敛性 三、函数…

无痛接入图像生成风格迁移能力:GAN生成对抗网络

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

网络安全:探索云安全的最佳实践

文章目录 网络安全&#xff1a;探索云安全的最佳实践引言云安全简介云安全面临的挑战云安全的最佳实践数据加密身份和访问管理定期安全审计 结语 网络安全&#xff1a;探索云安全的最佳实践 引言 在我们之前的文章中&#xff0c;我们讨论了网络安全的多个方面&#xff0c;包括…

卫生间毫米波雷达跌倒检测,飞睿智能人体存在感应器,智能识别老人跌倒守护安全

在智能家居飞速发展的今天&#xff0c;雷达技术已经悄然走进了我们的生活&#xff0c;尤其在卫生间这样的特殊场景中&#xff0c;毫米波雷达人体存在感应器和跌倒检测技术的应用&#xff0c;通过及时识别老年人跌倒等意外情况&#xff0c;及时发送警报信息&#xff0c;不仅为我…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

数据库物理计划执行指南

一、背景介绍 伴随信息技术地迅猛发展和应用范围地逐步扩大&#xff0c;数据库已成为企业存储与管理数据的重要工具。但数据量激增以及用户访问需求的与日剧增&#xff0c;数据库性能也将面临巨大挑战。 好在数据库物理计划执行是解决数据库性能问题的重要手段之一&#xff0…

【机器学习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 &#xff08;1&#xff09;神经网络的基本组成单位 &#xff08;2&#xff09;生物上&#xff0c;每个神经元通过树突接受来自其他被激活神经元的信息&#xff0c;通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

基础购物车(Javascript)

使用Javascript写一个基础购物车&#xff0c;其中包含商品数量加加减减&#xff0c;下面的总价和总数量跟着商品数量变动&#xff0c;还可以自己添加需要的商品。 基础购物车的结构样式如下&#xff1a; HTML代码&#xff1a; <body><table border"1px" c…

百度智能云推出智能运维工具,云助手让云服务器运维更简单

为了提升云服务器执行命令的效率&#xff0c;百度智能云发布了 SmartTerm 远程连接终端。不止于此&#xff0c;为了更加极致地提升运维效率&#xff0c;我们又推出了「云助手」这款轻量快捷的运维工具。 ​ 只有做过云服务器运维的人才知道管理上万台云服务器有多崩溃。在海量…

全局指令选择

概述 基于SelectionDAG 的指令选择方法可以生成质量较高的机器码&#xff0c;但代价是开发难度和代码复杂度较高 快速指令选择方法复杂度较低&#xff0c;但代码质量较差。为了综合二者的优点&#xff0c;取长补短&#xff0c;LLVM在现有的架构上实现了全局指令选择&#xff…

四川音盛佳云电子商务有限公司引领商业新潮流

在当今这个数字化飞速发展的时代&#xff0c;电商行业正以其独特的魅力吸引着越来越多的目光。而在众多电商企业中&#xff0c;四川音盛佳云电子商务有限公司凭借其专业、专注的抖音电商服务&#xff0c;逐渐崭露头角&#xff0c;成为行业的佼佼者。 四川音盛佳云电子商务有限…

AI智能盒子助力打造垃圾发电AI应用标杆!

垃圾焚烧发电作为一种新型的垃圾处理方式&#xff0c;能将其转化为电能&#xff0c;实现资源的再利用&#xff0c;成为实现节能环保的重要方式之一。为有效落实环境、安全、健康及社会责任管理体系&#xff0c;知名垃圾发电投资运营商光大环保能源致力于广泛利用科技&#xff0…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

Python Django Vue3 在线商城网站 在线商城后台管理 案例源码

源码地址获取 演示视频 Python DjangoVue3 在线商城网站&#xff0c;商城管理后台系统案例源码 附带运行教程&#xff0c;开发工具&#xff0c;系统运行演示 技术栈:Django Vue3 开发工具:Pycharm 后端构建工具:Pip 前端构建工具:WebPack 运行环境:Windows Python版本:3.11 Nod…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考&#xff1a; https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低&#xff0c;按照下面的步骤进行操作&#xff1a; 使用的硬件平台为Xavier NX&#xff0c;系统环境如下图&#xff1a; 搭建docker环境需求跟实际环境一致如下…

【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法&#xff0c;这是一种面向StableDiffusion的图像编辑算法。在这篇论文中&#xff0c;StableDiffusion可用于实现图像编辑的本质被挖掘&…

智慧之光照亮黑暗矿井:揭秘未来矿山的智能化革命

1. 煤矿行业背景概述 1.1 煤矿行业产能概述 截至2018年底&#xff0c;全国安全生产许可证等证照齐全的生产煤矿3373处&#xff0c;产能35.3亿吨/年。 已核准&#xff08;审批&#xff09;、开工建设煤矿1010处&#xff0c;产能10.3亿吨/年。 13个亿吨级煤炭能源基地&#xf…

Vulnhub——AI: WEB: 1

渗透复现 &#xff08;1&#xff09;目录扫描爆破出隐藏页面info.php和传参页面&#xff0c;泄露网站绝对路径并且存在SQL注入点 &#xff08;2&#xff09;已知网站绝对路径&#xff0c;存在SQL注入点&#xff0c;尝试OS-shell写入 &#xff08;3&#xff09;OS-shell写入后…

数据库:与红黑树不同的延迟序列

在内存里维护一个序列&#xff0c;可能第一个想到的就是红黑树。但是&#xff0c;红黑树算法复杂&#xff0c;这还不是主要的&#xff0c;主要的问题是&#xff1a;红黑树的空间利用率低。 红黑树的空间利用率 一个红黑树的节点&#xff0c;包括父节点指针、两个子节点指针、…