Redis内存管理

在这里插入图片描述

Redis使用Jemalloc(默认编译)来进行内存的管理:

Jemalloc将内存分成许多不同的区域,每个区域成为arena,areana之间相互独立。Jemalloc通过创建多个arena来减少线程申请内存的操作冲突。一般arena数量为cpu数量*4.

arena以chunk为单位向操作系统申请空间,默认为2MB。Jemalloc会把chunk分割成多个run。run里面有多个page,其默认大小为4kb。run必须是page的整数倍大小。(mysql的page为16kb大小,页 →区(1MB)→段(256MB))

Jemalloc会将run划分成若干个大小相同的region,并将region分配给应用使用。按大小region分为small、large、huge三类。

Jemalloc使用bin来管理small region,large region直接从chunk中申请,对于huge region,Jemalloc直接向系统申请内存,Jemalloc使用红黑树管理huge region。

Jemalloc在arena分配内存时,需要对arena或者region对应的bin进行加锁(通过划分不同区域,来最小化锁的竞争,这一点在mysql上也很常见,比如mysql的undo表有多个undo段,可以支持数量极多的并发)。为了减少同步,Jemalloc会为每个线程分配一个私有缓存tcache,缓存当前线程已申请的内存块(small/large)。在线程申请内存块时,Jemalloc会优先查找私有缓存空间对应的内存块,避免到arena中申请内存导致线程同步。

用户每次请求的内存大小会被向上对齐最接近的region:
1. 将应用申请的内存大小向上对齐最接近的region
2. 如果申请的是small region或小于私有缓存(tcache)的large region,则尝试先从large region开始分配,分配成功则结束
3. 如果申请的是small region,则从对应的bin找一块合适的run,从run中划分一块region(对bin加锁)
4. 如果申请的是large region,则从对应的chunk中申请相应大小的run并返回(对arena加锁)
5. 如果申请是huge region,直接向下同申请内存,并添加到对应的红黑树进行管理

如果arena中没有可用的chunk了,Jemalloc会向操作系统申请chunk。如果一个chunk的所有内存已经释放,Jemalloc会将chunk归还给系统。

Jemalloc会统计脏页(待回收)的数量,当脏页的数量超过一定的比例,会启动GC清除脏页,并尝试合并相邻的空间,将其返回给系统或者可用区域。Redis的碎片整理机制就是通过Jemalloc来进行的。

Redis数据过期机制

redis有两种机制删除过期数据:定时删除和惰性删除,无论是定时删除还是惰性删除,都需将命令传播给AOF文件和从节点。

  1. 定时删除
    1. 遍历指定数量的数据库
    2. 获取数据库,记录当前正处理的的数据库
    3. 处理该数据库中的过期字典
    4. 执行一次删除采样操作,通过采样数据量中已过期健的比例,预估整个数据库中的过期健比例
    5. 计算待处理的Hash表数组索引,按顺序处理
    6. 检查索引上所有的健,删除过期健,每次检查一个健,采样健加一
    7. 没执行16次采样操作删除动作,就检查处理时间是否超出限制
    8. 根据采样结果统计已过期健所占比例,若小于配置,则不再处理
  2. 惰性删除
    1. 获取当前内存使用量并判断是否需要淘汰数据
    2. 处理LRU、LFU算法
    3. 从给定的数据集(数据字典或过期字典)采集样本填充到样本池。样本池中的数据按淘汰优先级排序,越优先淘汰的数据放到最后。
    4. 从样本池中获取淘汰优先级最高的数据作为待淘汰健
    5. 如果使用的是随机淘汰算法,则从指定的数据集里随机选择一个健作为淘汰健
    6. 删除前面选择的淘汰健

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA 综合笔记

仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…

Python使用QtSide6(PyQt)编写界面

1、安装QtSide6 开始菜单cmd 创建虚拟环境 python -m venv env2 进入虚拟环境 call env2/scripts/activate 安装Pyside6 pip install Pyside6 2、设计Qt界面 打开designer.exe,设计界面 点击菜单【窗体】【View Python Code...】,点击【全部复制】…

HarmonyOs透明弹窗(选择照片弹窗样式)

1.鸿蒙中需要实现一个如下图的弹窗 2.由上图中可以得出,只需要三个Text组件依次向下排列,弹窗背景设置透明即可,弹窗代码如下(仅展示弹窗样式): /**** 自定义选择图片弹窗** 外部定义需要导出*/ CustomDialog //自定义弹窗 export…

android13顶部状态栏里面调节背光,不隐藏状态栏面板

总纲 android13 rom 开发总纲说明 目录 1.前言 2.代码分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 android13顶部状态栏里面调节背光,这个时候状态栏面板会被隐藏掉,有些需求就需要不隐藏这个面板。 2.代码分析 查找亮度条属性 id/brightness_slider ./frameworks/b…

TOMCAT入门到精通

目录 一 WEB技术 1.1 HTTP协议和B/S 结构 1.2 前端三大核心技术 1.2.1 HTML 1.2.2 CSS(Cascading Style Sheets)层叠样式表 1.2.3 JavaScript 二 WEB框架 2.2后台应用架构 2.2.1单体架构 2.2.2微服务 2.2.3单体架构和微服务比较 三 tomcat的…

2024Go语言面试宝典Golang零基础实战项目面试八股力扣算法笔记等

2024最新Golang面试八股文,以及各种零基础全套实战项目,经典力扣算法题以及常见的面试题型,大厂面试题。go语言面试必备。包括GO基础类、GO并发编程、GO RUNTIME、微服务、容器技术、Redis、MySQL、Linux、缓存、网络和操作系统、消息队列、分…

房产系统架构开发小程序分析

房产系统架构开发小程序在当前市场中具有显著的优势和潜力。以下是对房产小程序的分析: 用户需求满足:房产小程序通过提供楼盘信息查询、VR看房体验、购房流程指南等功能,满足用户对房产信息的需求,并提供更加便捷的用户体验 。…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]crypto6

题目: 先转为base16 JZLVK6CNKRATKT2ENN2FUR2NGBGXSMDYLFWVC6SMKRAXOWLKKF2E6VCBO5HVISLXJZVEKMKPI5NGY再转base32 NWUxMTA5ODktZGM0My0xYmQzLTAwYjQtOTAwOTIwNjE1OGZl再转base64,得到答案 5e110989-dc43-1bd3-00b4-9009206158fe

如何使用GPT-SoVITSS生成各种角色的语言

百度网盘 请输入提取码 项目来自b站UP主花儿不哭 一,先除去背景声音————人生伴奏出去背景声音 1.下载后,按下面路径打开,打开文件beta,打开go-webui程序 回车,然后稍等一下,等待网页打开 2.勾选如下…

day6JS-DOM(文档对象模型)

DOM树 DOM 操作 1. 获取元素 1.1 根据id名获取元素 document.getElementById("id名"); 案例&#xff1a; <body><div id"box">div盒子</div><h1>一级标题</h1><script>console.log(document.getElementById(&quo…

群晖NAS万兆网卡跑不满的真正原因

公司有几台群晖NAS,型号有DS2419+,和RS2418+,DS1821+,阵列都做了RAID6。当年都是花了大价钱买的存储,都上了万兆网卡,前面两个型号的速度速度始终在300MB左右徘徊,始终跑不满万兆,尤其大容量迁移的时候非常痛苦,之前200TB的数据迁移,整整用了一个月。 今天特意拿了群…

vue vite创建项目步骤

1. 创建vue项目 node版本需18以上 不然报错 npm init vuelatest2. 项目配置 配置项目的icon配置项目的标题配置jsconfig.json 3. 项目目录结构划分 4.css样式的重置 npm install normalize.cssreset.css html {line-height: 1.2; }body, h1, h2, h3, h4, ul, li {padding…

SpringBoot教程(二十五) | SpringBoot整合Sharding-JDBC分库分表

SpringBoot整合Sharding-JDBC分库分表 前言1. 什么是Sharding&#xff1f;2. 什么是Sharding-JDBC&#xff1f; 所需的maven依赖注意点&#xff08;关于shardingsphere的配置情况&#xff09;实操一&#xff1a;如何水平分表1. 步骤说明2. 创建数据库和表3.配置application.pro…

如何将TRIZ技术融入到智能家居的产品设计流程中?

在探讨如何将TRIZ&#xff08;发明问题解决理论&#xff09;技术融入智能家居产品设计流程中时&#xff0c;我们首先需要理解TRIZ作为一种系统化的创新方法论&#xff0c;其核心在于提供一套科学的工具和算法&#xff0c;帮助解决复杂的技术难题&#xff0c;加速产品创新过程。…

(LLM) 很笨

大型语言模型 (LLM) 并非你所想的那样。你被骗了。LLM 很笨&#xff0c;非常笨。事实上&#xff0c;它们更接近数据库&#xff0c;而不是人类。 这就是为什么人工智能仍然处于征服智能的第一步……如果有的话。 终极煤气灯效应 建立前沿人工智能的成本很高。前沿人工智能需要大…

C++系列-多态的基本语法

多态的基本语法 多态的含义静态多态动态多态 多态的底层原理多态中的final和overridefinaloverride: 多态的应用和优点计算器简单实现电脑组装的实现 《游山西村》 南宋陆游 莫笑农家腊酒浑&#xff0c;丰年留客足鸡豚。 山重水复疑无路&#xff0c;柳暗花明又一村。 箫鼓追…

STL—list—模拟实现【迭代器的实现(重要)】【基本接口的实现】

STL—list—模拟实现 1.list源代码 要想模拟实现list&#xff0c;还是要看一下STL库中的源代码。 _list_node里面装着指向上一个节点的指针prev&#xff0c;和指向下一个节点的指针next&#xff0c;还有数据data 并且它给的是void*&#xff0c;导致后面进行节点指针的返回时…

GitHub开源的轻量级文件服务器,可docker一键部署

文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器&#xff0c;不仅支持静态文件服务&#xff0c;还能轻松上传、下载、搜索文件&#xff0c;甚至支持WebDAV&#xff0c;让我们通过Web方式远程管理文件变得轻而易举。…

免费生产设备日志采集工具

使用咨询: 扫码添加QQ 永久免费: Gitee下载最新版本 使用说明: CSDN查看使用说明 功能: 定时(全量采集or增量采集) SCADA,MES等系统采集工控机,办公电脑文件. 优势1: 开箱即用. 解压直接运行.插件集成下载. 优势2: 批管理设备. 配置均在后台配置管理. 优势3: 无人值守 采集端…

软考-软件设计师(程序设计语言习题)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…