内存分配

Redis进程的内存消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片。
1 自身内存

Redis自身内存消耗非常少,通常used_memory在800KB左右,used_memory_rss在3M左右。Redis的内存消耗主要在于后面三个。(used_memory和used_memory_rss的概念在下面介绍)
2 对象内存

对象内存是Redis内存占用最大的一块,存储着用户的所有数据,还包括慢查询日志等Redis帮我们维护的一些内存数据。
3 缓冲内存

缓冲内存主要包括:客户端缓冲、复制积压缓冲、AOF重写缓冲。
3.1 客户端缓冲

客户端缓冲指的是所有连到Redis服务器的TCP连接的输入缓冲和输出缓冲。

Redis为每个客户端分配了输入缓冲区,用于临时保存客户端发过来的命令,同时Redis服务器会从输入缓冲区中拉取命令执行,输入缓冲区为客户端向服务端发送的命令提供了缓冲的功能。输入缓冲区大小无法控制,每个客户端的输入缓冲区最大空间为1G,如果超出将断开连接。

同样的Redis为每个客户端分配了输出缓冲区,用于临时保存服务端执行的命令结果,同时Redis服务器会从输出缓冲区中拉取结果返回到客户端,输出缓冲区为服务端向客户端返回结果提供了缓冲。

输出缓冲区根据客户端的类型又划分为三种:普通客户端、发布订阅客户端、从客户端(Redis复制的slave客户端)。每种客户端的输出规则也不一样,这里就不细说了。
3.2 复制积压缓冲

Redis在2.8版本之后提供了一个可重用的固定大小的缓冲区用于实现增量复制的功能,根据repl-backlog-size参数来控制,默认大小1MB。

对于复制积压缓冲区主节点只有一个,所有从节点共享一个,这个缓冲区可以有效地避免全量复制。
3.3 AOF重写缓冲区

AOF重写缓冲区用于在AOF重写期间保存写命令,所以AOF重写缓冲区的大小取决于AOF的时间以及AOF重写期间的写命令数量。

等到AOF重写完成之后,会将AOF重写缓冲区中的数据写到AOF文件,从而清空AOF重写缓冲区。
4 内存碎片

Redis默认内存分配器采用jemalloc,可选的分配器还有:glibe、tcmalloc。

内存分配器是为了更好的管理和重复利用内存,分配内存策略一般采用固定范围的内存块进行内存分配。

这里不去深究jemalloc的内存分配原理,简单地说jemalloc将内存空间划分为三个部分:Small class、Large class、Huge class,每个部分又划分为很多小的内存块单位:
- Small class: [8byte], [16byte, 32byte, … 128byte], [192byte, 256byte, … 512byte], [768byte, 1024byte, … 3840byte]
- Large class: [4kb, 8kb, 12kb, … 4072kb]
- Huge class: [4mb, 8mb, 12mb …]

简单来说就是采用不同大小的内存块来存储不同大小的内存对象,比如说一个5kb的对象就会存到8kb的内存块中,那么剩下的3kb内存就变成了内存碎片,不能再被分配给其他对象。

通常在对key做频繁更新操作和大量过期key被删除的时候会导致碎片率上升,可以考虑重启节点的方式重新整理碎片。
内存查看

使用 info 命令可以看到当前Redis内存使用情况:

192.168.1.4:0>info memory
"# Memory
used_memory:1938704
used_memory_human:1.85M
used_memory_rss:10444800
used_memory_rss_human:9.96M
used_memory_peak:2948848
used_memory_peak_human:2.81M
used_memory_peak_perc:65.74%
used_memory_overhead:1919050
used_memory_startup:786608
used_memory_dataset:19654
used_memory_dataset_perc:1.71%
total_system_memory:8083607552
total_system_memory_human:7.53G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:4294967296
maxmemory_human:4.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:5.39
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

其中:
属性名 属性说明
used_memory Redis内部存储的所有数据占用的内存
used_memory_human used_memory 以M为单位显示
used_memory_rss 操作系统为Redis进程分配的物理内存总量
used_memory_peak 内存使用过的最大值
maxmemory 给Redis分配的内存上限
total_system_memory 系统内存
used_memory_lua Lua脚本占用内存大小

需要注意的是其中 used_memory 表示Redis内部存储的所有数据占用的内存,也就是对象内存,而 used_memory_rss 表示操作系统为Redis进程分配的物理内存总量,也就是上面四种内存的总和。

当used_memory < used_memory_rss时,说明used_memory_rss中多余出来的内存没有被用来存储对象。如果两个值的差值很大,说明碎片率很高。

当used_memory > used_memory_rss时,说明操作系统采用了内存交换,把Redis内存交换(swap)到硬盘。内存交换(swap)对于Redis来说是致命的,Redis能保证高性能的一个重要前提就是读写都基于内存。如果操作系统把Redis使用的部分内存交换到硬盘,由于硬盘的读写效率比内存低上百倍,会导致Redis性能急剧下降,特别容易引起Redis阻塞。

今天这篇文章主要介绍了Redis的内存划分以及查看Redis的内存使用情况,后面将带来Redis的内存上限设置以及Redis的回收策略。
---------------------
作者:Lebron_Chen
来源:CSDN
原文:https://blog.csdn.net/Leon_cx/article/details/82597722

Redis的内存分配的更多相关文章

  1. Redis深入学习笔记(六)Redis内存分配

    Redis的高效可以说是轻量级的epoll模型和基于内存的读写共同组成的,关于epoll对于以前的select或者poll的性能优势这里不做介绍,本篇主要介绍领一个重点,Redis的内存分配原理. 获 ...

  2. CentOS的Redis内存分配策略配置

    安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...

  3. 8.Redis内存分配

    8.Redis内存分配8.1 内存消耗8.1.1 内存使用统计8.1.2 内存消耗划分8.1.3 子进程内存消耗8.2 内存管理8.2.1 设置内存上限8.2.2 动态调整内存上限8.2.3 内存回收 ...

  4. redis源码解读--内存分配zmalloc

    目录 主要函数 void *zmalloc(size_t size) void *zcalloc(size_t size) void zrealloc(void ptr, size_t size) v ...

  5. redis内存分配管理与集群环境下Session管理

    ##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...

  6. Memcache 内存分配策略和性能(使用)状态检查

    前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...

  7. 线上redis服务内存异常分析。

    项目中,新增了一个统计功能,用来统计不同手机型号的每天访问pv,看了下redis2.6有个setbit的功能,于是打算尝尝鲜把 redis从2.4更新到了2.6 因为是租了vps.服务器的内存只有4g ...

  8. Redis学习-内存优化

    以下为个人学习Redis的备忘录--内存优化 1.随时查看info memory,了解内存使用状况:127.0.0.1:6379> info memory# Memoryused_memory: ...

  9. RAMCloud:内存云存储的内存分配机制

    现在全闪存阵列已经见怪不怪了,EMC的XtremIO,还有VNX-F(Rockies),IBM FlashSystem.全闪存真正为效率而生,重新定义存储速度.凭借极致性能,高可用性,为您极大提高企业 ...

随机推荐

  1. selenium--页面元素是否可见和可操作

    判断元素是否可见 from selenium import webdriver import unittest class Test_Display(unittest.TestCase): def t ...

  2. scp 文件 : /目录: Permission denied

    Q: A: 进入目录,用root登录,修改权限为777 再进行上传即可:

  3. Android Studio 之 Navigation【1.页面之间的切换】

    1.创建 2个 Fragment ,下面两个include 不要勾 2.创建好 Fragment 后,打开layout中的 fragment.xml 文件,将里面默认的 textView 控件删除掉 ...

  4. fibnacci数列递归

    1,斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这 ...

  5. 【Gamma】 Phylab 展示博客

    目录 [Gamma] Phylab 展示博客 发布地址 网站:PhyLab GitHub Release: WhatAHardChoice/Phylab Gamma版本 一.团队简介 二.项目目标 2 ...

  6. Linux 就该这么学 CH06 存储结构与磁盘划分

    1.一切从"/"开始 linux系统中一切都是文件,而且一切文件的路径都是从根目录(/)开始的.系统中的根目录和文件名称都是严格区分大小写的,并且文件名中不能包含/符号. 绝对路径 ...

  7. AQS3---出队(凌乱,供参考,先看AQS2)

    出队时候,如果队列处于稳定状态,那么就是一个挨着一个出队,难点在于出队的时候,队列正处于调整阶段,那么此时队列中的关系是混乱无章可寻的.  出队:unlock释放锁,不在队列线程去抢锁,队列第一个正常 ...

  8. python 关于celery的异步任务队列的基本使用(celery+redis)【采用配置文件设置】

    工程结构说明:源文件下载请访问https://i.cnblogs.com/Files.aspx __init__.py:实例化celery,并加载配置模块 celeryconfig.py:配置模块 t ...

  9. CentOS下安装php 5.6.19

    # php安装包下载wget https://www.php.net/distributions/php-5.6.19.tar.bz2# 解压bunzip2 php-5.6.19.tar.bz2tar ...

  10. seleium 之 EC 的用法

    场景 Expected Conditions的使用场景有2种 直接在断言中使用 与WebDriverWait配合使用,动态等待页面上元素出现或者消失 方法注释 先翻译一下这些方法的用法 title_i ...