redis 内存使用

116 阅读3分钟

1、对象内存\n对象内存,也即真实存储的数据所占用的内存。\n\nredis k-v结构存储,对象占用可以简单的理解为 k-size + v-size。\n\nredis的键统一都为字符串类型,值包含多种类型:string、list、hash、set、zset五种基本类型及基于string的Bitmaps和HyperLogLog类型等。\n\n在实际的应用中,一定要做好kv的构建形式及内存使用预期,可以参考 关于redis,你需要了解的几点!中关于不同值类型不同形式下的内部存储实现介绍。\n\n2、缓冲内存\n缓冲内存包括三部分:客户端缓存、复制积压缓存及AOF缓冲区。\n\n1)客户端缓存\n接入redis服务器的TCP连接输入输出缓冲内存占用,TCP输入缓冲占用是不受控制的,最大允许空间为1G。输出缓冲占用可以通过client-output-buffer-limit参数配置。\n\nredis 客户端主要分为从客户端、订阅客户端和普通客户端。\n\n从客户端连接占用:也就是我们所说的slave,主节点会为每一个从节点建立一条连接用于命令复制,缓冲配置为:client-output-buffer-limit slave 256mb 64mb 60。\n\n主从之间的间络延迟及挂载的从节点数量是影响内存占用的主要因素。因此在涉及需要异地部署主从时要特别注意,另外,也要避免主节点上挂载过多的从节点(\u003C=2);\n\n订阅客户端内存占用:发布订阅功能连接客户端使用单独的缓冲区,默认配置:client-output-buffer-limit pubsub 32mb 8mb 60。\n\n当消费慢于生产时会造成缓冲区积压,因此需要特别注意消费者角色配比及生产、消费速度的监控。\n\n普通客户端内存占用:除了上述之外的其它客户端,如我们通常的应用连接,默认配置:client-output-buffer-limit normal 1000。\n\n可以看到,普通客户端没有配置缓冲区限制,通常一般的客户端内存消耗也可以忽略不计。\n\n但是当redis服务器响应较慢时,容易造成大量的慢连接,主要表现为连接数的突增,如果不能及时处理,此时会严重影响redis服务节点的服务及恢复。\n\n关于此,在实际应用中需要注意几点:\n\nmaxclients最大连接数配置必不可少。\n\n合理预估单次操作数据量(写或读)及网络时延ttl。\n\n禁止线上大吞吐量命令操作,如keys等。\n\n高并发应用情景下,redis内存使用需要有实时的监控预警机制,\n\n2)复制积压缓冲区\nv2.8之后提供的一个可重用的固定大小缓冲区,用以实现向从节点的部分复制功能,避免全量复制。配置单数:repl-backlog-size,默认1M。单个主节点配置一个复制积压缓冲区。\n\n3)AOF缓冲区\nAOF重写期间增量的写入命令保存,此部分缓存占用大小取决于AOF重写时间及增量。\n\n3、内存碎片内存占用\n关于redis,你需要了解的几点!简单介绍过redis的内存分配方式。(更多面试题,欢迎关注公众号 Java面试题精选)