Redis数据删除后-内存占用为何居高不下 (redis数据类型)
作为面试经验丰富的开发人员,肯定会遇到过这样的问题:做了数据删除操作,为什么使用
top
命令时,仍然显示 Redis 占用了大量内存?
答案
这是因为当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录为给 Redis 分配了大量内存。
used_memory_rss
记录了在操作系统的角度,Redis 进程占用的物理总内存。
Redis 内存消耗组成
Redis 内存消耗主要分为两部分:主进程消耗和子进程消耗。
主进程消耗
主进程消耗主要包括以下几个方面:
- 自身进程占用内存:Redis 进程自身所占用的内存,通常非常小。
- 数据对象内存:存储键值对的内存,通常是 Redis 中占用内存最大的部分。不同的数据类型占用的内存大小不同。
- 缓冲区内存:Redis 有三个主要的缓冲区:客户端缓冲区、AOF 缓冲区和复制缓冲区。
- 内存碎片:由操作系统的内存分配机制和 Redis 的存储特性引起。
子进程消耗
子进程消耗是指在 RDB 和 AOF 重写时 fork() 子进程的内存消耗。
查看内存指标
使用
infomemory
命令(集群环境下使用
clusterinfo
命令)查看当前 Redis 相关内存信息。
例如:
127.0.0.1:6379> infomemory
Memory
used_memory:856472 Redis 存储数据占用的内存量
used_memory_human:836.40K 以人类可读形式返回内存总量
used_memory_rss:1282048 操作系统的角度,进程占用的物理总内存
used_memory_rss_human:1.22M used_memory_rss 可读性模式展示
used_memory_peak:857448 内存使用的最大值,表示 used_memory 的峰值
used_memory_peak_human:837.35K 以可读的格式返回 used_memory_peak 的值
used_memory_lua:37888 Lua 引擎所消耗的内存大小。
used_memory_overhead:103104 Redis 自身的开销,包括数据结构和管理开销
used_memory_dataset:803552 存储键值对的内存大小
内存碎片
内存碎片主要由以下两个原因引起:
- 操作系统的内存分配机制:操作系统通常使用一种称为内存管理单元(MMU)的硬件来管理内存。当分配内存时,MMU 会将内存划分为称为页面的固定大小块。当 Redis 分配内存时,它可能会分配多个页面,并且某些页面可能会未使用(称为碎片)。
- Redis 存储特性:Redis 使用一种称为哈希表的内部数据结构来存储键值对。当添加或删除键值对时,哈希表可能会调整其大小。这可能导致未使用空间,从而产生碎片。
清理内存碎片
Redis 提供了一些命令来清理内存碎片:
-
shrinkmemory
:释放 Redis 进程中未使用的内存。这可能会导致内存碎片的增加,但可以减少 Redis 占用的总内存量。 -
memory doctor
:分析 Redis 内存使用情况并提供建议以减少碎片。不过,它不会自动修复碎片。 -
defragment
:主动整理 Redis 内存,减少碎片。不过,它可能会导致 Redis 性能暂时下降。
在决定使用哪个命令时,需要权衡内存碎片的影响和 Redis 性能的影响。在某些情况下,可能需要重新启动 Redis 进程以彻底清除内存碎片。
总结
理解 Redis 内存管理对于优化 Redis 性能和高效利用内存资源非常重要。通过了解不同的内存消耗组成部分、内存碎片的原因以及如何清理碎片,可以确保 Redis 稳定高效地运行。
redis缓存数据,内存占满,怎么解决
1,增加内存;2,数据分流,即分散到多个电脑上面。 可以按一致性哈稀算法分布。 3,设置缓存数据的有效期,对于不重要的数据尽量不要缓存。 或缓存时间可以短一些。
请教大家一个 redis 内存占用的问题
用 del 命令删除了 redis 里五分之一的数据,可是 redis 的内存占用并没有下来, rdb 文件可以看到变小了的,只有 redis 重启才会降低内存占用,可是 redis 不能重启的。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。