FWQ
详解如何清理Redis内存碎片
详解如何清理Redis内存碎片 0浏览 收藏 大家好,今天本人给大家带来文章《详解如何清理Redis内存碎片》,文中内容主要涉及到redis内存、碎片,如果你对数据库方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢! 明明做了数据删除,数据量已经不大了,为什么使用 top 命令查看时,还会发现 Redis 占用了很多内存呢?实际上,这是因为,当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。 Redis 释放的内存空间可能并不是连续的,那么,这些不连续的内存空间很有可能处于一种闲置的状态。这就会导致一个问题:虽然有空闲空间,Redis 却无法用来保存数据,不仅会减少 Redis 能够实际保存的数据量,还会降低 Redis 运行机器的成本回报率。 什么是Redis内存碎片? 操作系统的剩余空间总量足够,但申请一块N字节连续地址的空间时,剩余内存空间中没有大小为N字节的连续空间,那么这些剩余内存空间中,小于N字节的连续内存空间就是内存碎片。 Redis内存碎片是如何形成的? 内存碎片形成有内部原因和外部原因: 内部原因:内存分配器的分配策略决定操作系统无法做到“按需分配”。 Redis使用libc、jemalloc、tcmalloc多种内存分配器来分配内存,默认使用jemalloc。 内存分配器是按照固定大小来分配内存空间,不是完全按照应用程序申请的内存大小来分配。 以jemalloc为例,是按照一系列固定的大小划分内存空间,例如8字节、16字节、32字节、…、2KB、4KB等。当程序申请的内存最接近某个固定值时,jemalloc就会给它分配相应大小的空间。 外部原因:键值对大小不一样,并且键值对可以被修改和删除。 Redis申请内存空间分配时,对于大小不一的内存空间需求,内存分配器按照固定大小分配内存空间,分配的内存空间一般都会比申请的内存空间大一些,这会产生一定的内存碎片。 键值对会被修改和删除,会导致空间的扩容和释放。…