Redis缓冲区溢出怎么解决

缓冲区(buffer),是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

一、Redis缓冲区溢出影响

在Redis中,主要有三个场景用到了缓冲区的概念。

在客户端和服务器端之间进行通信时,用来暂存客户端发送的命令数据,或者是服务器端返回给客户端的数据结果 在主从节点间进行数据同步时,Redis使用缓冲区来暂存主节点接收的写命令和数据 在Redis进行AOF持久化的时候Redis为了避免频繁写磁盘同样用到了缓冲区的概念

缓冲区概念最初是操作系统为了缓和 CPU 与 I/O 设备速度不匹配的矛盾,提高 CPU 和 I/O 设备的并行性而引入的。

对于高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备。有了缓冲区的概念就可以很好的解决这个问题。缓冲区也是生产者消费者模式的重要体现。

Redis缓冲区溢出怎么解决

1、缓冲区溢出导致网络连接关闭

如果 qubf-free 耗尽,就会引起客户端输入缓冲区溢出,Redis 的处理方法就是把客户端连接关闭,导致的结果就是业务程序无法进行数据存取。

2、缓冲区溢出导致命令数据丢失或者崩溃

通常情况下,会有很多的客户端连接,当客户端连接占用的内存总量,超过了 Redis 的 maxmemory 配置时,就会触发 Redis 进行数据淘汰,影响业务程序的访问性能。

甚至多个客户端会导致 Redis 内存占用过大,也会导致内存溢出问题,进而引起 Redis 崩溃。

二、客户端缓冲区

客户端缓冲区又有两个,输入缓冲区和输出缓冲区,都是为了解决客户端和服务器端的请求发送和处理速度不匹配所设置的。

Redis缓冲区溢出怎么解决

输入缓冲区暂存的是客户端发来的命令,其常见的溢出原因有两个:

写入了BigKey,如一次性写入了百万级别的哈希或集合数据,超过了缓冲区的大小 服务端处理请求的速度过慢导致阻塞,无法及时处理请求,使得客户端发送的请求在缓冲区内越积越多。

输出缓冲区暂存的是 Redis 主线程要返回给客户端的数据。

这个数据,既有简单且大小固定的 OK 响应(例如,执行 SET 命令)或报错信息,也有大小不固定的、包含具体数据的执行结果(例如,执行 HGET 命令)

输出缓冲区常见的溢出原因有三种:

返回BigKey的大量结果 执行了某些不合理的命令 缓冲区大小设置不合理

从输入和输出缓冲区常见导致溢出的原因来看,BigKey是最可能导致溢出的原因,因此我们应该尽量避免使用BigKey。

对于输入缓冲区,因为没有办法改变其大小(默认每个客户端1G),我们只能通过控制命令的发送和处理速度入手,尽量避免阻塞。

对于输出缓冲区则要避免一些返回大量结果的命令的使用如KEYS,MONITOR等,同时可以通过调整输出缓冲区的大小来避免溢出。

三、复制缓冲区

复制缓冲区是用于Redis主从节点之间复制时使用的。由于主从节点间的数据复制包括全量复制和增量复制两种。因此复制缓冲区也分为复制缓冲区和复制积压缓冲区两种。

1、复制缓冲区

在全量复制过程中,主节点在向从节点传输 RDB 文件的同时,会继续接收客户端发送的写命令请求。这些写命令会先被保存在复制缓冲区中,当 RDB 文件传输完成后,才会发送给从节点并执行。为了确保主从节点之间的数据同步,每个从节点在主节点上都有维护一个复制缓冲区。

Redis缓冲区溢出怎么解决

对于复制缓冲区,如果主库传输 RDB 文件以及从库加载 RDB 文件耗时长,同时主库接收的写命令操作较多,就会导致复制缓冲区被写满而溢出。

想要避免复制缓冲区溢出,一方面我们可以控制主节点保存的数据量大小,这样可以让RDB文件的传输以及从库加载时间变快,以避免复制缓冲区累积过多命令。

也可以根据主节点的数据量大小、主节点的写负载压力和主节点本身的内存大小来更合理的设置复制缓冲区的大小来避免溢出,此外,由于主节点会为每一个从节点设置一个复制缓冲区,如果集群中的从节点数非常多的话,主节点的内存开销就会非常大,因此我们应该尽量避免一个主节点有过多的从节点。

2、复制积压缓冲区

在增量复制过程中,当主节点与从节点进行常规同步时,写命令会被暂存在复制缓冲区中。如果从节点和主节点间发生了网络断连,等从节点再次连接后,可以从复制积压缓冲区中同步尚未复制的命令操作。

Redis缓冲区溢出怎么解决

需要注意的是复制积压缓冲区是一个大小有限的环形缓冲区。

当主节点把复制积压缓冲区写满后,会覆盖缓冲区中的旧命令数据。此时会造成主从节点的数据不一致。

针对这个问题,一般的应对的方法是调大复制积压缓冲区的大小,这个大小的计算方式一般可以使用

缓冲区大小=(主库写入命令速度 * 操作大小 - 主从库间网络传输命令速度 * 操作大小)* 2

登录后复制

如果如果并发请求量非常大,调整缓冲区大小的方式还不能解决,那么可以考虑使用切片集群的方式解决

四、AOF缓冲区

AOF缓冲区是Redis在AOF持久化的所设置的缓冲区,AOF缓冲区也有两种AOF缓冲区和AOF重写缓冲区。

1、AOF缓冲区

我们都知道,即使是固态硬盘,它的读写速度也是与内存的读写速度相差很多的。AOF缓冲区就主要是Redis用来解决主进程执行命令速度与磁盘写入速度不同步所设置的,通过AOF缓冲区可以有效地避免频繁对硬盘进行读写,进而提升性能。在进行AOF持久化时,Redis会先将命令写入AOF缓冲区,随后按照回写策略将其写入硬盘AOF文件。

Redis缓冲区溢出怎么解决

AOF缓冲区的溢出可能与磁盘写入速度有关系,也可能与AOF回写策略有关系,当大量命令积压在AOF缓冲区,超过其设置阈值之后,就会导致缓冲区溢出,想要避免这个问题,我们可以通过调整回写策略,或者调整AOF缓冲区大小的方式来解决。

2、AOF重写缓冲区

AOF重写缓冲区是Redis在子进程进行AOF重写的时候,父进程接受了新的命令,此时会把命令写入AOF重写缓冲区,等到子进程重写完成后,把AOF重写缓冲区命令追加到新的AOF文件中。

Redis缓冲区溢出怎么解决

 AOF重写缓冲区的溢出与AOF重写期间主进程所处理的命令数有关系,当AOF重写期间Redis主进程处理了大量的命令,这些命令都会写入AOF重写缓冲区,当超过设定阈值之后,就会导致溢出。

避免AOF重写缓冲区的溢出我们也可以通过调整AOF重写缓冲区的大小来解决。

以上就是Redis缓冲区溢出怎么解决的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2030710.html

(0)
上一篇 2025年2月23日 21:57:10
下一篇 2025年2月23日 21:57:29

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • redis使用实例分析

    第一part:原生jedis连接redis 首先我们为要先了解,我们在原先使用mysql的时候,用jdbc连接数据库。同理这里我们连接redis,就要使用jedis。 第一步:新建java项目,导包 新建java项目,导包     redi…

    2025年2月23日 数据库
    100
  • Python Redis数据处理的方法

    1. 前言 Redis:Remote Dictionary Server,即:远程字典服务,Redis 底层使用 C 语言编写,是一款开源的、基于内存的 NoSql 数据库 由于 Redis 性能远超其他数据库,并且支持集群、分布式及主从同…

    2025年2月23日
    100
  • 宝塔中ThinkPHP框架使用Redis的方法是什么

    redis是一种常用的非关系型数据库,主要用作数据缓存,数据保存形式为key-value,键值相互映射。它的数据存储跟mysql不同,它数据存储在内存之中,所以数据读取相对而言很快,用来做高并发非常不错。 关于redis的安装,在服务器或者…

    2025年2月23日
    100
  • springboot连接不上redis怎么解决

    第一种 查看防火墙是否打开6379端口 查看防火墙状态 systemctl status firewalld 登录后复制 如果防火墙没有启动的话。可以选择直接看后面两种方法。 或者就是打开防火墙,然后继续下面的步骤: 开启端口 firewa…

    2025年2月23日
    100
  • redis延迟双删策略怎么使用

    通常情况下,我们会优先选择使用redis缓存来降低数据库访问负担。但是也会遇到以下这种情况:大量用户来访问我们系统,首先会去查询缓存, 如果缓存中没有数据,则去查询数据库,然后更新数据到缓存中,并且如果数据库中的数据发生了改变则需要同步到r…

    2025年2月23日
    100
  • Redis+SpringBoot案例分析

    一、项目环境 前端技术栈:vue-cli 前端软体:WebStorm 2020.3 前端样式: Bootstrap 后端技术栈:SpringBoot 后端软体:IntelliJ IEDA2019 JavaJDK:1.8 服务器:阿里云Cen…

    2025年2月23日 数据库
    100
  • SpringBoot整合Redis缓存如何实现

    SpringBoot支持的缓存组件 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.Ca…

    2025年2月23日 数据库
    100
  • 怎么用Redis实现搜索接口

    对于后端开发人员来讲使用一条sql就可以实现列表查询的接口,如果查询条件很复杂,表库设计不合理,会导致查询很困难,这篇文章和大家分享一下用redis实现搜索接口。 下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口…

    2025年2月23日 数据库
    100
  • 如何使用Redis的streams

    起源 自从在 redis 4.0 引入模块后,用户开始思考如何解决这些问题。其中一个用户 timothy downs 通过 irc 和我说道: 我计划给这个模块增加一个事务日志式的数据类型 —— 这意味着大量的订阅者…

    数据库 2025年2月23日
    100
  • Redis持久化机制实现原理和流程是什么

    redis持久化机制实现原理是什么? 持久化:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现…

    数据库 2025年2月23日
    100

发表回复

登录后才能评论