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
首先是数据的内存分配,作为数据库,数据是最主要的部分,这部分占用的内存会统计在 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内存相关的知识就介绍到这里了。




