暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis的内存模型

Alleria Windrunner 2020-11-18
176
前面几篇我们已经介绍了Redis基本的理论知识,本篇我们来看一下Redis的内存模型,关于这块的知识我们需要掌握查看内存的命令以及其内存的分配。
首先我们可以使用info memory命令来查看内存信息:
    127.0.0.1:6379> info memory# Memory 
    #Redis分配的内存总量,包括虚拟内存(字节)
    used_memory:853464
    #占操作系统的内存,不包括虚拟内存(字节)
    used_memory_rss:12247040
    #内存碎片比例 如果小于0说明使用了虚拟内存
    mem_fragmentation_ratio:15.07
    #Redis使用的内存分配器
    mem_allocator:jemalloc-5.1.0
    具体的每一个指标代表什么意思我都已经备注了,那么接下来我们就一个个具体分析一下。

    Redis的内存分配

    首先是数据的内存分配,作为数据库,数据是最主要的部分,这部分占用的内存会统计在 used_memory 中。Redis 使用键值对存储数据,其中的值(对象)包括 5 种类型,即字符串、哈希、列表、集合、有序集合。这 5 种类型是 Redis 对外提供的,实际上,在 Redis 内部,每种类型可能有 2 种或更多的内部编码实现。

    然后是进程的内存分配,Redis 主进程本身运行肯定需要占用内存,如代码、常量池等等,这部分内存大约几M,在大多数生产环境中与 Redis 数据占用的内存相比可以忽略。这部分内存不是由 jemalloc 分配,因此不会统计在 used_memory 中。除了主进程外,Redis 创建的子进程运行也会占用内存,如 Redis 执行 AOF、RDB 重写时创建的子进程。当然,这部分内存不属于 Redis 进程,也不会统计在 used_memory 和 used_memory_rss 中。

    然后是缓冲区占用的内存,缓冲内存包括客户端缓冲区、复制积压缓冲区、AOF 缓冲区等。其中,客户端缓冲区存储客户端连接的输入输出缓冲,复制积压缓冲区用于部分复制功能,AOF 缓冲区用于在进行 AOF 重写时,保存最近的写入命令。这部分内存由 jemalloc 分配,因此会统计在 used_memory 中。

    再然后是内存碎片,内存碎片是 Redis 在分配、回收物理内存过程中产生的。例如,如果对数据的更改频繁,而且数据之间的大小相差很大,可能导致 Redis 释放的空间在物理内存中并没有释放。

    但 Redis 又无法有效利用,这就形成了内存碎片,内存碎片不会统计在 used_memory 中。内存碎片的产生与对数据进行的操作、数据的特点等都有关。此外,与使用的内存分配器也有关系:如果内存分配器设计合理,可以尽可能的减少内存碎片的产生。如果 Redis 服务器中的内存碎片已经很大,可以通过安全重启的方式减小内存碎片:因为重启之后,Redis 重新从备份文件中读取数据,在内存中进行重排,为每个数据重新选择合适的内存单元,减小内存碎片。

    那么关于Redis内存相关的知识就介绍到这里了。

    文章转载自Alleria Windrunner,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论