广告
返回顶部
首页 > 资讯 > 数据库 >redis4.0下MEMORY命令详解
  • 175
分享到

redis4.0下MEMORY命令详解

2024-04-02 19:04:59 175人浏览 安东尼
摘要

这篇文章主要介绍“Redis4.0下MEMORY命令详解”,在日常操作中,相信很多人在redis4.0下MEMORY命令详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”re

这篇文章主要介绍“Redis4.0下MEMORY命令详解”,在日常操作中,相信很多人在redis4.0下MEMORY命令详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis4.0下MEMORY命令详解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

在过去,查看redis的内存使用状态只有info memory命令,而且也只有一些基础信息,想要获取全局信息就有些困难。4.0开始redis提供了MEMORY命令,一切都变得简单起来。

MEMORY命令

MEMORY命令一共有5个子命令,可以通过MEMORY HELP来查看:

127.0.0.1:6379> memory help

1) "MEMORY DOCTOR - Outputs memory problems report"

2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"

3) "MEMORY STATS - Show memory usage details"

4) "MEMORY PURGE - Ask the allocator to release memory"

5) "MEMORY MALLOC-STATS - Show allocator internal stats"

接下来我们从MEMORY STATS开始,一一介绍各个子命令的功能。

1. MEMORY STATS

首先,我们需要明确一个概念,redis的内存使用不仅包含所有的key-value数据,还有描述这些key-value的元信息,以及许多管理功能的消耗,比如持久化、主从复制,通过MEMORY STATS可以更好的了解到redis的内存使用状况。

这里我们启动了一个打开持久化功能并且带slave的redis,向其中随机写入了一些数据(某些数据还带有过期时间),以便读者可以更好的了解redis的内存使用,接下来执行MEMORY STATS命令:

127.0.0.1:6379> memory stats

 1) "peak.allocated"

 2) (integer) 423995952

 3) "total.allocated"

 4) (integer) 11130320

 5) "startup.allocated"

 6) (integer) 9942928

 7) "replication.backlog"

 8) (integer) 1048576

 9) "clients.slaves"

10) (integer) 16858

11) "clients.nORMal"

12) (integer) 49630

13) "aof.buffer"

14) (integer) 3253

15) "db.0"

16) 1) "overhead.hashtable.main"

    2) (integer) 5808

    3) "overhead.hashtable.expires"

    4) (integer) 104

17) "overhead.total"

18) (integer) 11063904

19) "keys.count"

20) (integer) 94

21) "keys.bytes-per-key"

22) (integer) 12631

23) "dataset.bytes"

24) (integer) 66416

25) "dataset.percentage"

26) "5.5934348106384277"

27) "peak.percentage"

28) "2.6251003742218018"

29) "fragmentation"

30) "1.1039986610412598"

一共有15项内容,内存使用量均以字节为单位,我们一个一个来看:

1. peak.allocated

redis启动到现在,最多使用过多少内存。

2. total.allocated

当前使用的内存总量。

3. startup.allocated

redis启动初始化时使用的内存,有很多读者会比较奇怪,为什么我的redis启动以后什么都没做就已经占用了几十MB的内存?

这是因为redis本身不仅存储key-value,还有其他的内存消耗,比如共享变量、主从复制、持久化和db元信息,下面各项会有详细介绍。

4. replication.backlog

主从复制backlog使用的内存,默认10MB,backlog只在主从断线重连时发挥作用,主从复制本身并不依赖此项。

5. clients.slaves

主从复制中所有slave的读写缓冲区,包括output-buffer(也即输出缓冲区)使用的内存和querybuf(也即输入缓冲区),这里简单介绍一下主从复制:

redis把一次事件循环中,所有对数据库发生更改的内容先追加到slave的output-buffer中,在事件循环结束后统一发送给slave。

那么主从之间就难免会有数据的延迟,如果主从之间连接断开,重连时为了保证数据的一致性就要做一次全量同步,这显然是不够高效的。backlog就是为此而设计,master在backlog中缓存一部分主从复制的增量数据,断线重连时如果slave的偏移量在backlog中,那就可以只把偏移量之后的增量数据同步给slave即可,避免了全量同步的开销。

6. clients.normal

除slave外所有其他客户端的读写缓冲区。

有时候一些客户端读取不及时,就会造成output-buffer积压占用内存过多的情况,可以通过配置项client-output-buffer-limit来限制,当超过阈值之后redis就会主动断开连接以释放内存,slave亦是如此。

7. aof.buffer

此项为aof持久化使用的缓存和aofrewrite时产生的缓存之和,当然如果关闭了appendonly那这项就一直为0:

redis并不是在有写入时就立即做持久化的,而是在一次事件循环内把所有的写入数据缓存起来,待到事件循环结束后再持久化到磁盘。

aofrewrite时缓存增量数据使用的内存,只在aofrewrite时才会使用,aofrewrite机制可以参考之前的文章《redis4.0之利用管道优化aofrewrite》。

可以看出这一项的大小与写入流量成正比。

8. db.0

redis每个db的元信息使用的内存,这里只使用了db0,所以只打印了db0的内存使用状态,当使用其他db时也会有相应的信息。

db的元信息有以下三项:

a) redis的db就是一张hash表,首先就是这张hash表使用的内存(redis使用链式hash,hash表中存放所有链表的头指针);

b) 每一个key-value对都有一个dictEntry来记录他们的关系,元信息便包含该db中所有dictEntry使用的内存;

c) redis使用redisObject来描述value所对应的不同数据类型(string、list、hash、set、zset),那么redisObject占用的空间也计算在元信息中。

overhead.hashtable.main:

db的元信息也即是以上三项之和,计算公式为:

hashtable + dictEntry + redisObject

overhead.hashtable.expires:

对于key的过期时间,redis并没有把它和value放在一起,而是单独用一个hashtable来存储,但是expires这张hash表记录的是key-expire信息,所以不需要`redisObject`来描述value,其元信息也就少了一项,计算公式为:

hashtable + dictEntry

9. overhead.total

3-8项之和:startup.allocated+replication.backlog+clients.slaves+clients.normal+aof.buffer+dbx

10. dataset.bytes

所有数据所使用的内存——也即total.allocated - overhead.total——当前内存使用量减去管理类内存使用量。

11. dataset.percentage

所有数据占比,这里并没有直接使用total.allocated做分母,而是除去了redis启动初始化的内存,计算公式为:

100 * dataset.bytes / (total.allocated - startup.allocated)

12. keys.count

redis当前存储的key总量

13. keys.bytes-per-key

平均每个key的内存大小,直觉上应该是用dataset.bytes除以keys.count即可,但是redis并没有这么做,而是把管理类内存也平摊到了每个key的内存使用中,计算公式为:

(total.allocated - startup.allocated) / keys.count

14. peak.percentage

当前使用内存与历史最高值比例

15. fragmentation

内存碎片率

2. MEMORY USAGE

相信所有redis用户都希望对每一个key-value的内存使用了如指掌,然而4.0之前redis并没有提供一个明确的方法来进行内存评估,不过从4.0开始,MEMORY命令实现了这一功能。

首先看下使用方法:MEMORY usage [samples]

命令参数不多,通过字面意思也可以看出来是评估指定key的内存使用情况。samples是可选参数默认为5,以hash为例看下其如果工作:

首先类似于上一节中的overhead.hashtable.main,要计算hash的元信息内存,包括hash表的大小以及所有dictEntry的内存占用信息。

与overhead.hashtable.main不同的是,每个dictEntry中key-value都是字符串,所以没redisObject的额外消耗。在评估真正的数据内存大小时redis并没有去遍历所有key,而是采用的抽样估算:随机抽取samples个key-value对计算其平均内存占用,再乘以key-value对的个数即得到结果。试想一下如果要精确计算内存占用,那么就需要遍历所有的元素,当元素很多时就是使redis阻塞,所以请合理设置samples的大小。

其他数据结构的计算方式类似于hash,此处就不再赘述。

3. MEMORY DOCTOR

此项子命令是作者给出的关于redis内存使用方面的建议,在不同的允许状态下会有不同的分析结果:

首先是没问题的情况

运行状态良好:

Hi Sam, I can't find any memory issue in your instance. I can only account for what occurs on this base.

redis的数据量很小,暂无建议:

Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for your mission on Earth and fill it with some data. The new Sam and I will be back to our programming as soon as I finished rebooting.

接下来出现的结果就需要注意了

内存使用峰值1.5倍于目前内存使用量,此时内存碎片率可能会比较高,需要注意:

Peak memory: In the past this instance used more than 150% the memory that is currently using. The allocator is normally not able to release memory after a peak, so you can expect to see a big fragmentation ratio, however this is actually harmless and is only due to the memory peak, and if the Redis instance Resident Set Size (RSS) is currently bigger than expected, the memory will be used as soon as you fill the Redis instance with more data. If the memory peak was only occasional and you want to try to reclaim memory, please try the MEMORY PURGE command, otherwise the only other option is to shutdown and restart the instance.

内存碎片率过高超过1.4,需要注意:

High fragmentation: This instance has a memory fragmentation greater than 1.4 (this means that the Resident Set Size of the Redis process is much larger than the sum of the logical allocations Redis performed). This problem is usually due either to a large peak memory (check if there is a peak memory entry above in the report) or may result from a workload that causes the allocator to fragment memory a lot. If the problem is a large peak memory, then there is no issue. Otherwise, make sure you are using the Jemalloc allocator and not the default libc malloc.

每个slave缓冲区的平均内存超过10MB,原因可能是master写入流量过高,也有可能是主从同步的网络带宽不足或者slave处理较慢:

Big slave buffers: The slave output buffers in this instance are greater than 10MB for each slave (on average). This likely means that there is some slave instance that is struggling receiving data, either because it is too slow or because of networking issues. As a result, data piles on the master output buffers. Please try to identify what slave is not receiving data correctly and why. You can use the INFO output in order to check the slaves delays and the CLIENT LIST command to check the output buffers of each slave.

普通客户端缓冲区的平均内存超过200KB,原因可能是pipeline使用不当或者Pub/Sub客户端处理消息不及时导致:

Big client buffers: The clients output buffers in this instance are greater than 200K per client (on average). This may result from different causes, like Pub/Sub clients subscribed to channels bot not receiving data fast enough, so that data piles on the Redis instance output buffer, or clients sending commands with large replies or very large sequences of commands in the same pipeline. Please use the CLIENT LIST command in order to investigate the issue if it causes problems in your instance, or to understand better why certain clients are using a big amount of memory.

4. MEMORY MALLOC-STATS

打印内存分配器状态,只在使用jemalloc时有用。

5. MEMORY PURGE

请求分配器释放内存,同样只对jemalloc生效。

到此,关于“redis4.0下MEMORY命令详解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: redis4.0下MEMORY命令详解

本文链接: https://www.lsjlt.com/news/59879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis4.0下MEMORY命令详解
    这篇文章主要介绍“redis4.0下MEMORY命令详解”,在日常操作中,相信很多人在redis4.0下MEMORY命令详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”re...
    99+
    2022-10-18
  • Redis4.0 info命令汇总详解
    Server(服务器信息) redis_version:4.0.2                  &...
    99+
    2022-10-18
  • linux下source命令使用详解
    Linux Source命令及脚本的执行方式解析 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用source命令,如:source /etc/profile 对so...
    99+
    2022-06-04
    详解 命令 linux
  • Linux下压缩与解压命令详解
    本文为大家分享了Linux下压缩与解压缩命令,供大家参考,具体内容如下 【tar命令】 解压:tar -zxvf FileName.tar 压缩:tar -czvf FileName.tar DirName...
    99+
    2022-06-04
    详解 命令 Linux
  • 详解linux下tree命令的用法
    tree命令,主要功能是创建文件列表,将所有文件以树的形式列出来 linux下的tree就比较强大了,但一般系统并不自带这个命令,需要手动下载安装, 安装 : yum -y install tree ...
    99+
    2022-06-04
    详解 命令 linux
  • linux下的tar命令详细解释
    tar命令 [root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指...
    99+
    2022-06-04
    命令 详细 linux
  • Linux下alias命令的用法详解
    1.alias的使用 alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化. 用alias 短命令='原命令 选项' alias 138ssh= 'ssh -i ~/.ssh/138....
    99+
    2022-06-04
    Linux alias
  • Linux下的fdisk命令用法详解
    linux下的fdisk功能是极其强大的,用它可以划分出最复杂的分区,下面简要介绍一下它的用法: 对于IDE硬盘,每块盘有一个设备名:对应于主板的四个IDE接口,设备名依次为:/dev/hda,/dev/hdb,/dev...
    99+
    2022-06-04
    Linux fdisk用法 fdisk用法
  • shell下time”命令的输出详解
    这篇文章主要讲解了“shell下time”命令的输出详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell下time”命令的输出详解”吧!前言相信大家都知道bash下time是一个很有...
    99+
    2023-06-09
  • Linux下tcpdump命令解析及使用详解
    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump可以将网络中传送的数据包的“头”完全截获下来...
    99+
    2022-06-03
    Linux tcpdump命令
  • Linux下的压缩解压缩命令详解
    linux zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. unzip unzip -o -d /home/sunny myfil...
    99+
    2023-10-27
    linux 服务器 运维
  • shell(bash)下“time” 命令的输出详解
    前言 相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便。但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定...
    99+
    2022-06-04
    详解 命令 shell
  • linux下scp和sftp命令使用详解
    目录前言1. scp 使用2. sftp 使用3. scp 和 sftp 有啥区别?用哪个好?总结前言 scp 和 sftp 是一种远程文件加密传输协议,讲通俗点就是用来操控本地/远程文件,不知道你注意到了没有,它们开头...
    99+
    2022-06-04
    linux中scp命令 linux中sftp命令
  • Linux系统下gcc命令使用详解
    目录一.预处理二. 编译三.汇编四.链接1.gcc的安装(以Ubuntu为例) sudo apt-get install build-essential 安装完后可以通过 gcc --version 查看版本。 让我们在...
    99+
    2022-06-04
    Linux GCC命令的详解 linux安装gcc命令
  • linux下的yum命令原理和详解
    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自...
    99+
    2022-06-04
    linux yum 命令 安装 更新 删除
  • Linux命令详解(14)useradd命令
    useradd用于添加一个linux账户。adduser跟本命令等价。 useradd同样属于不复杂但很重要的命令。 --help获得帮助信息。 -b选项,制定家目录的根  -c选项,给新用户添加说明信息 -d选项,给新用户设置家目录 ...
    99+
    2023-08-31
    linux 运维 服务器
  • Linux 命令之rsync命令详解
    rsync命令 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的...
    99+
    2022-06-04
    命令 详解 Linux
  • Linux命令详解(15)lsof命令
    lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。它是 List Open Files的缩写。 使用 lsof,你可以获取任何被打开文件的各种信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身...
    99+
    2023-09-02
    服务器 运维 lsof
  • Linux下打包压缩和解压命令详解
    本篇内容主要讲解“Linux下打包压缩和解压命令详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下打包压缩和解压命令详解”吧!zip的使用和常用参数: -a 将文件转成ASCII模式...
    99+
    2023-06-13
  • linux中rz上传、sz下载命令详解
    rz,sz是便是linux/Unix同Windows进行ZModem文件传输的命令行工具。 使用前提: 首先,你的Linux端(CentOS, Ubuntu)需要安装rz/sz命令,也就是 lszrz 包。 其次,wi...
    99+
    2022-06-04
    rz sz rz sz 安装 linux rz sz
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作