94. 熟悉Redis吗,项目中你是如何对Redis内存进行优化的(一)
对于redis来说,什么是最重要的?
毋庸置疑,是内存。
一、reids 内存分析
redis内存使用情况:info memory
示例:
可以看到,当前节点内存碎片率为226893824/209522728≈1.08,使用的内存分配器是jemalloc。
used_memory_rss 通常情况下是大于 used_memory 的,因为内存碎片的存在。
但是当操作系统把redis内存swap到硬盘时,memory_fragmentation_ratio 会小于1。redis使用硬盘作为内存,因为硬盘的速度,redis性能会受到极大的影响。
二、redis 内存使用
之前的文章 关于redis,你需要了解的几点!中我们简单介绍过redis的内存使用分布:自身内存,键值对象占用、缓冲区内存占用及内存碎片占用。
https://www.cnblogs.com/niejunlei/p/12896605.html
redis 空进程自身消耗非常的少,可以忽略不计,优化内存可以不考虑此处的因素。
1、对象内存
对象内存,也即真实存储的数据所占用的内存。
redis k-v结构存储,对象占用可以简单的理解为 k-size + v-size。
redis的键统一都为字符串类型,值包含多种类型:string、list、hash、set、zset五种基本类型及基于string的Bitmaps和HyperLogLog类型等。
在实际的应用中,一定要做好kv的构建形式及内存使用预期,可以参考 关于redis,你需要了解的几点!中关于不同值类型不同形式下的内部存储实现介绍。
2、缓冲内存
缓冲内存包括三部分:客户端缓存、复制积压缓存及AOF缓冲区。
1)客户端缓存
接入redis服务器的TCP连接输入输出缓冲内存占用,TCP输入缓冲占用是不受控制的,最大允许空间为1G。输出缓冲占用可以通过client-output-buffer-limit参数配置。
redis 客户端主要分为从客户端、订阅客户端和普通客户端。
**从客户端连接占用:**也就是我们所说的slave,主节点会为每一个从节点建立一条连接用于命令复制,缓冲配置为:client-output-buffer-limit slave 256mb 64mb 60。
主从之间的间络延迟及挂载的从节点数量是影响内存占用的主要因素。因此在涉及需要异地部署主从时要特别注意,另外,也要避免主节点上挂载过多的从节点(<=2);
**订阅客户端内存占用:**发布订阅功能连接客户端使用单独的缓冲区,默认配置:client-output-buffer-limit pubsub 32mb 8mb 60。
当消费慢于生产时会造成缓冲区积压,因此需要特别注意消费者角色配比及生产、消费速度的监控。
普通客户端内存占用:除了上述之外的其它客户端,如我们通常的应用连接,默认配置:client-output-buffer-limit normal 1000。
可以看到,普通客户端没有配置缓冲区限制,通常一般的客户端内存消耗也可以忽略不计。
但是当redis服务器响应较慢时,容易造成大量的慢连接,主要表现为连接数的突增,如果不能及时处理,此时会严重影响redis服务节点的服务及恢复。
关于此,在实际应用中需要注意几点:
maxclients最大连接数配置必不可少。
合理预估单次操作数据量(写或读)及网络时延ttl。
禁止线上大吞吐量命令操作,如keys等。
高并发应用情景下,redis内存使用需要有实时的监控预警机制,
2)复制积压缓冲区
v2.8之后提供的一个可重用的固定大小缓冲区,用以实现向从节点的部分复制功能,避免全量复制。配置单数:repl-backlog-size,默认1M。单个主节点配置一个复制积压缓冲区。
3)AOF缓冲区
AOF重写期间增量的写入命令保存,此部分缓存占用大小取决于AOF重写时间及增量。
3、内存碎片内存占用
关于redis,你需要了解的几点!简单介绍过redis的内存分配方式。