什么是内存碎片
存储数据实际所用内存空间少于系统分配的内存空间,没有被用到的这部分内存空间就是内存碎片。
Redis 为什么有内存碎片
- Redis 存储数据的时向操作系统申请的内存空间可能会大于数据实际需要的存储空间
Redis 有多种内存分配器,默认是 jemalloc,当程序申请的内存最接近某个固定值时,jemalloc 会给它分配相应大小的空间,就比如说程序需要申请 17 字节的内存,jemalloc 会直接给它分配 32 字节的内存而不是 16 字节,这样会导致有 15 字节内存的浪费。
- 频繁修改 Redis 中的数据也会产生内存碎片
比如删除数据时 Redis 通常不会轻易释放内存给操作系统,而是保留在自己的空闲池中,供后续分配复用。因为频繁地向系统申请和释放内存,性能开销很大,Redis 优先考虑 低延迟和高吞吐,因此宁愿“浪费”一点内存,也不愿频繁触发系统调用或产生页表抖动;