Redis进程内消耗的是什么

42次阅读
没有评论

共计 1593 个字符,预计需要花费 4 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章给大家分享的是有关 Redis 进程内消耗的是什么的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考。一起跟随丸趣 TV 小编过来看看吧。

Redis 进程内消耗主要包括:自身内存 + 对象内存 + 缓冲内存 + 内存碎片。

内存。因为 redis 的数据都是存储在内存当中。内存数据库相比一般的关系型数据库,读取速度要更快,但是消耗的内存资源会更多。

对象内存

对象内存是 Redis 内存占用最大的一块,存储着用户所有的数据。Redis 所有数据都采用 key-value 数据类型,每次创建键值对时,至少创建两个类型对象:key 对象和 value 对象。内存消耗可以简单的理解为 sizeof(keys)+sizeof(values)。键对象都是字符串,在使用 Redis 时很容易忽略键对内存消耗的影响,应当避免使用过长的键。value 对象更复杂些,主要包括 5 种基本数据类型:字符串、列表、哈希、集合、有序集合。每种 value 对象类型根据使用规模不同,占用内存不同。在使用时一定要合理预估并监控 value 对象占用情况,避免内存溢出。

缓冲内存

缓冲内存主要包括:客户端缓冲、复制积压缓冲区、AOF 缓冲区。

客户端缓冲指的是所有接入到 Redis 服务器 TCP 连接的输入输出缓冲。输入输出缓冲无法控制,最大空间为 1G,如果超过将断开连接。输入缓冲通过参数 client-output-buffer-limit 控制:

1. 普通客户端:除了复制和订阅的客户端之外的所有连接,Redis 的默认配置是:client-output-buffer-limit normal 0 0 0,Redis 并没有对普通客户端的输出缓冲区做限制,一般普通客户端的内存消耗可以忽略不计,但是当有大量慢连接客户端接入时这部分内存消耗就不能忽略了,可以设置 maxclients 做限制。注意不要只用大量数据输出的命令且数据无法及时推送给客户端,如 monitor 命令,容易造成 Redis 服务器内存突然飙升。

从客户端:主节点会为每个从节点单独建立一条连接用于命令复制,默认配置是:client-output-buffer-limit slave 256mb 64mb 60。当主从节点之间网络延迟较高或主节点挂载大量从节点时这部分内存消耗将占用很大一部分,建议主节点挂载的从节点不要多于 2 个,主从节点不要部署在较差的网络环境下,如异地跨机房,防止复制客户端连接缓慢造成溢出。

订阅客户端:当使用发布订阅功能时,连接客户端使用单独的输出缓冲区,默认配置为:client-output-buffer-limit pubsub 32mb 8mb 60,当订阅服务的消息生产快于消费速度时,输出缓冲区会产生积压造成输出缓冲区空间溢出。

复制积压缓冲区:Redis 在 2.8 版本之后提供了一个可重用的固定大小缓冲区用于实现部分复制功能,根据 repl-backlog-size 参数控制,默认为 1MB。对于复制积压缓冲区整个主节点只有一个,所有从节点共享此缓冲区,因此可以设置较大的缓冲区空间,如 100MB。

AOF 缓冲区:这部分空间用于在 Redis 重写期间保存最近的写入命令。

3. 内存碎片

Redis 默认的内存分配器采用 jemalloc,可选的分配器还有:glibc、tcmalloc。内存分配器为了更好地管理和重复利用内存,分配内存策略一般采用固定范围的内存块进行分配。

以下场景容易出现高内存碎片问题:

频繁做更新操作,例如频繁对已存在的键执行 append、setrange 等更新操作。

大量过期键删除,键对象过期删除后,释放的空间无法得到充分利用,导致碎片率上升。

感谢各位的阅读!关于 Redis 进程内消耗的是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-18发表,共计1593字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)