Redis 内存的优化

目录

前言

Redis 的内存碎片问题

判断Redis 内存碎片

如何清理内存碎片?


前言

我想讲一下怎么提高Redis 内存的利用率,redis 的数据是保存在内存中。对内存的利用率低,意味着存的数据很少,并不意味着就没有内存了,而是这些内存没法利用了,后果就是会自动删除一些key,删除key 大量的内存释放,同时会把释放的内存放到一个空的链表里,如果操作系统开始了swap,会把数据保存在磁盘。这些都会影响redis 性能。

上面讲了内存利用率低会造成什么连锁的反应,内存利用率低就是内存碎片,接下来,我将详细讲述什么是内存碎片,对于Redis 我们该怎么解决内存利用率低的问题。

Redis 的内存碎片问题

Redis 可以使用 libc、jemalloc、tcmalloc 多种内存分配器来分配内存,默认使用 jemalloc。我就讲讲 jemalloc 分配器的分配策略,是按照2的n次方大小分配内存空间的。比如我们需要写20字节的数据,那么Redis就分配32字节,这样分配的好处是,可以少分配内存,接下来,我们需要写10字节的数据,就不用重新分配内存了,分配内存本身也会消耗系统的性能。

为什么会形成内存碎片呢,和Redis 的内存分配策略有一定关系,还是拿上面的例子说,我们用了10字节,还剩下2字节,下次我们需要4字节,2字节就用不到,需要重新申请,2字节就是内存碎片。这只是其中的一个原因,还有就是Redis 需要不断的修改删除,在这个过程中也会产生内存碎片。比如下面:

现在应用C 删除2个字节,意味着2个字节的空间被释放

现在应用A修改成5个字节,那么上面还有2个字节用不到,不是连续的空间,对于A来说需要重新申请空间:

此时来说对于上下两段内存来说,就有多个内存碎片,后续可能会被利用

如果redis 开启了清理内存碎片,会是这样的,应用B的一个字节会拷贝到下图位置,应用A刚好就是5个字节,不用申请内存空间呢

上面是我们的分析,对于Reis 我们如何判断是否有内存碎片呢?

判断Redis 内存碎片

redis 通过INFO这个命令可以查看Redis的利用率

INFO memory
# Memory
used_memory:1073741736
used_memory_human:1024.00M
used_memory_rss:1997159792
used_memory_rss_human:1.86G
…
mem_fragmentation_ratio:1.86

mem_fragmentation_ratio 就是Redis 的内存碎片率,

used_memory_rss 是操作系统实际分配给 Redis 的物理内存空间,里面就包含了碎片;而 used_memory 是 Redis 为了保存数据实际申请使用的空间也就是实际数据的大小。

mem_fragmentation_ratio = used_memory_rss/used_memory

mem_fragmentation_ratio>1.5 表明碎片率已经超过50%,这个时候就需要碎片整理

mem_fragmentation_ratio>=1 并且 mem_fragmentation_ratio<1.5 这个是正常的,是因为redis 内存分配机制引起的

mem_fragmentation_ratio<1 那就很悲催了,内存用完了,很可能发生的swap,需要增加实例

如何清理内存碎片?

从 4.0-RC3 版本以后,提供了一种清理机制,只需要配置文件配置一下就可以了。

activedefrag yes 就是开启清理机制

清理的提交是什么,下面两个提交必须同时满足:

  1. active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理;

  2. active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理。

但是这个清理是有代价的,Redis 的读写都是主线程操作的,主要是先要拷贝数据到新的位置,在释放空间,在利用以前的空间。这就是三个步骤,并且这个步骤是顺序执行的。

为了尽可能减少碎片清理对 Redis 正常请求处理的影响,自动内存碎片清理功能在执行时,还会监控清理操作占用的 CPU 时间,而且还设置了两个参数,分别用于控制清理操作占用的 CPU 时间比例的上、下限,既保证清理工作能正常进行,又避免了降低 Redis 性能。这两个参数具体如下:

  1. active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展;

  2. active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。

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

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

相关文章

【解读】OWASP大语言模型应用程序十大风险

OWASP大型语言模型应用程序前十名项目旨在教育开发人员、设计师、架构师、经理和组织在部署和管理大型语言模型&#xff08;LLM&#xff09;时的潜在安全风险。该项目提供了LLM应用程序中常见的十大最关键漏洞的列表&#xff0c;强调了它们的潜在影响、易利用性和在现实应用程序…

利用华为CodeArts持续交付项目演示流程

软件开发生产线&#xff08;CodeArts&#xff09;是面向开发者提供的一站式云端平台&#xff0c;即开即用&#xff0c;随时随地在云端交付软件全生命周期&#xff0c;覆盖需求下发、代码提交、代码检查、代码编译、验证、部署、发布&#xff0c;打通软件交付的完整路径&#xf…

力扣---腐烂的橘子

题目&#xff1a; bfs思路&#xff1a; 感觉bfs还是很容易想到的&#xff0c;首先定义一个双端队列&#xff08;队列也是可以的~&#xff09;&#xff0c;如果值为2&#xff0c;则入队列&#xff0c;我这里将队列中的元素定义为pair<int,int>。第一个int记录在数组中的位…

3.8IO作业

1&#xff1a;编写链表&#xff0c;链表里面随便搞点数据 使用 fprintf 将链表中所有的数据&#xff0c;保存到文件中 使用 fscanf 读取文件中的数据&#xff0c;写入链表中&#xff0c;实现&#xff0c;当按 ctrl c的时候&#xff0c;保存链表 #include <stdio.h> #in…

day15_集合_ArrayList

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习昨日 日期解析的方法签名(字符串–>日期) Date parse(String s) 日期格式化的方法签名(日期–>字符串) String format(Date date) 运行时异常有哪些…

19、电源管理入门之微内核中的电源管理

目录 1. QNX电源管理框架 2. QNX客户端API库 3. QNX代码分析 4. Fuchsia中的电源管理 5. Minix中的电源管理 6. Harmony OS中的电源管理 之前介绍的电源管理机制基本都是在Linux中实现的,可以看到很复杂,各种框架,明明一个操作非要转来转去,而且在内核里面实现,跟内…

【HarmonyOS】ArkTS-联合类型

目录 联合类型实例 联合类型 联合类型是一种灵活的数据类型&#xff0c;它修饰的变量可以存储不同类型的数据。 语法&#xff1a;let 变量: 类型1 | 类型2 | 类型3 值 基于联合类型&#xff0c;变量可存不同类型数据 实例 // 需求&#xff1a;定义一个变量&#xff0c;存放…

Spring web开发(入门)

1、我们在执行程序时&#xff0c;运行的需要是这个界面 2、简单的web接口&#xff08;127.0.0.1表示本机IP&#xff09; package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestCont…

srlua打包(Lua 5.4.6)

资源 Lua - Joe DFs Builds 或者在文章附加资源下载。 使用方法 在当前文件夹打开文件夹&#xff0c;使用cmd。srglue.exe srlua.exe in.lua out.exe 或 srglue srlua.exe in.lua out.exe in.lua&#xff1a;指用进行打包的lua文件。out.exe&#xff1a;指输出的exe文件的…

【OD】算法二

开源项目热度榜单 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、…

垃圾回收:JavaScript内存管理的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java算法-力扣leetcode-55. 跳跃游戏

55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…

ChatGPT 控制机器人的基本框架

过去的一年&#xff0c;OpenAI的chatGPT将自然语言的大型语言模型&#xff08;LLM&#xff09;推向了公众的视野&#xff0c;人工智能AI如一夜春风吹遍了巴黎&#xff0c;全世界都为AI而疯狂。 OpenAI ChatGPT是一个使用人类反馈进行微调的预训练生成文本模型。不像以前的模型主…

Spring Cloud Gateway自定义过滤器

自定义全局过滤器 相关面试题&#xff1a;统计接口调用耗时&#xff0c;如何落地&#xff0c;谈谈设计思路&#xff1f; 自定义统计接口耗时的全局过滤器 https://docs.spring.io/spring-cloud-gateway/docs/4.0.9/reference/html/#gateway-combined-global-filter-and-gatewa…

python中def简介及用法

什么是def&#xff1f; def是python中的一个关键字&#xff0c;它用于定义一个函数。函数是一段具有特定功能的代码&#xff0c;可以被重复调用&#xff0c;从而提高代码的复用性和可读性。 如何使用def&#xff1f; def的基本语法如下&#xff1a; def 函数名(参数列表):#…

MYSQL | 数据库到底是怎么来的?

“以史为鉴&#xff0c;可以让我们更深刻地理解现在&#xff0c;预见未来。” 要想知道一件东西是怎么发生的, 我们不妨把时间拨回关系型数据库被提出前后来探索。在信息技术飞速发展的今天&#xff0c;回望数据库管理系统的演进之路&#xff0c;我们可以深刻理解到技术进步如…

Go语言数据结构(二)堆/优先队列

文章目录 1. container中定义的heap2. heap的使用示例3. 刷lc应用堆的示例 更多内容以及其他Go常用数据结构的实现在这里&#xff0c;感谢Star&#xff1a;https://github.com/acezsq/Data_Structure_Golang 1. container中定义的heap 在golang中的"container/heap"…

ffmpeg批量旋转视频

1、新建一个txt文件&#xff0c;并复制如下代码进入&#xff0c;然后保存。 echo off & titlecd /d %~dp0md rotatefor %%a in (*.mp4) do (ffmpeg -i "%%~sa" -y -vf "transpose1" -q:v 1 "rotate\%%~na.mp4")pause2、把文件后缀修改为bat…

STC8G1K08串口通讯

/***豆腐干下位机测试 L573 CODE 3919 2021 1 25***/ /***STC8G1K08 三段时间控制程序 电机自动启停***/ #include <REG52.H> //下降一段设置 #include <intrins.h> //保压时间 #in…

js-判断变量是否定义

if (typeof myVar undefined) {// myVar (未定义) 或 (已定义但未初始化) } else {// myVar (已定义和已初始化) } 参考 https://www.cnblogs.com/redFeather/p/17662966.html