首页 > 编程知识 正文

redis消息队列(redis json序列化)

时间:2023-05-06 11:19:27 阅读:75461 作者:3697

缓冲区主要在一个内存区域临时存储命令数据,以避免由于数据和命令处理速度慢于发送速度而导致的数据丢失和性能问题。 但是,由于缓冲区内存有限,如果向内部写入数据的速度长于从内部读取数据的速度,则缓冲区需要越来越多的内存来临时存储数据。 当缓冲区使用的内存超过设定的上限阈值时,将发生缓冲区溢出。

Redis是典型的客户端-服务器体系结构,所有操作命令都必须在客户端发送到服务器端。 因此,Redis中缓冲器的一个主要应用方案是当客户端与服务器端进行通信时,用于临时存储从客户端发送的命令数据和服务器端返回到客户端的数据结果。 此外,缓冲区的另一个主要用途场景是在主节点和从节点之间进行数据同步时,临时存储主节点接收到的写命令和数据。

客户端输入缓冲区和输出缓冲区为每个连接的客户端都设置了输入缓冲区和输出缓冲区,以确保客户端和服务器端的请求发送和处理速度不一致。 这称为客户端输入缓冲区和输出缓冲区。

输入缓冲器临时保存客户端发送来的命令,Redis主线程从输入缓冲器读取命令进行处理。 Redis主线程处理数据后,结果将写入输出缓冲区,并通过输出缓冲区返回客户端,如下图所示。

客户端输入缓冲区溢出和溢出时如何处理:

在写入bigkey (例如,一次写入多个百万级聚合数据)的服务器端处理请求的速度太慢了。 例如,Redis主线程间歇性地被阻止,无法立即处理成功发送的请求。 结果,客户端发送的请求会累积在缓冲区中。 要检查连接到服务器端的每个客户端的输入缓冲区的使用情况,请使用客户端列表命令。

client listid=5addr=127.0.0.1336050487 FD=9name=age=4idle=0flags=ndb=0sub=0psub=0multi=-1 qbuf=26

一个是连接到服务器端的客户端的信息,addr显示不同客户端的IP和端口号。 另一个是与输入缓冲区相关的三个参数。 cmd表示客户端上次执行的命令。 qbuf指示输入缓冲区已经使用的大小。 qbuf-free表示输入缓冲区尚未使用的大小。 Redis服务器端通常服务多个客户端。 如果多个客户端连接超出了Redis的最大内存设置,Redis将触发数据销毁。

要避免输入缓冲区溢出,请从以下两个角度考虑:

要增加缓冲区,根据数据命令的发送和处理速度,Redis 的客户端输入缓冲区大小的上限阈值,在代码中就设定为了 1GB。没有参数可以配置Redis输出缓冲区Redis输出缓冲区有两部分:

一个是16KB的固定缓冲区,临时保存OK响应和错误消息。 另一个是可以动态添加以临时存储可变大小响应结果的缓冲区区域。 如果Redis输出缓冲区溢出,则服务器端返回的结果中包含bigkey,因为如果运行bigkey,该bigkey返回的bigkey返回的bigkey大小设置不正确,则原本会占用大量的内存空间

MONITOR命令用于监视Redis的执行,并持续输出每个被监视的命令操作。 MONITOR的输出结果持续占用输出缓冲区,占用的越多,发生溢出。 请不要在生产环境中继续使用监视器。

输出缓冲区的大小可以通过client-output-buffer-limit设置项进行调整。 具体的设定内容有以下两个。

设置缓冲区大小上限阈值设置缓冲区持续写入数据的次数上限阈值和持续写入数据的时间上限阈值的客户端类型不同,client-output-buffer-limit设置策略也不同。 Redis有两种类型的客户端。

一般而言,与Redis服务器端交换读写命令的普通客户端,订阅Redis通道的订阅客户端一般客户端设置输出缓冲区大小。

客户端-输出-缓冲区-极限正常00

其中,normal表示已经设置正常的客户端,第一个0表示已经设置缓冲器大小限制,第二个0和第三个0分别表示缓冲器持续写入量限制和持续写入时间限制。0表示不做限制。

在常规客户端上,每次提交请求时,都要等待请求的结果返回,然后再发送下一个请求。 这种发送方法称为阻塞发送。 在这种情况下,服务器端的输出缓冲区通常不会被阻止,除非读取卷是特别大的bigkey。

设置订阅客户端的缓冲区大小:

对于订阅客户端,如果订阅的Redis通道上有消息,服务器端将通过输出缓冲区向客户端发送消息。 不是块发送。 因此,请为订阅客户端设置缓冲区大小限制、缓冲区持续写入量限制和持续写入时间限制。

客户端- output-buffer-limit pubsub8mb2mb 60

pubsub参数指示当前已设置订阅客户端。 8mb表示输出缓冲区的大小

限为 8MB,一旦实际占用的缓冲区大小要超过 8MB,服务器端就会直接关闭客户端的连接;2mb 和 60 表示,如果连续 60 秒内对输出缓冲区的写入量超过 2MB 的话,服务器端也会关闭客户端连接

主从集群中的缓冲区

主从集群间的数据复制包括全量复制和增量复制两种。全量复制是同步所有数据,增量复制只会把主从库网络断连期间主库收到的命令,同步给从库。为保证主从节点的数据一致性,这两种形式的复制都会用到缓冲区。

复制缓冲区的溢出问题

在全量复制过程中,主节点在向从节点传输RDB文件的同时,会持续接收客户端发送的写命令请求。这些写命令请求就会先保存在复制缓冲区中,等RDB文件传输完成后,再发送给从节点去执行。主节点上会为每个从节点都维护一个复制缓冲区,来保证主从节点间的数据同步。

所以如果在全量复制时,从节点接收和加载RDB较慢,同时主节点接收到了大量的写命令,写命令在复制缓冲区中就会越积越多,最终导致溢出。

其实,主节点上的复制缓冲区,本质上也是一个用于和从节点连接的客户端(我们称之为从节点客户端),使用的输出缓冲区。复制缓冲区一旦发生溢出,主节点也会直接关闭和从节点进行复制操作的连接,导致全量复制失败。

如何避免复制缓冲区发生溢出? 一方面,可以控制主节点保存的数据量大小。主节点的数据量通常控制在2~4GB,这样全量同步执行更快,避免复制缓冲区累积过多命令。另一方面,我们可以使用 client-output-buffer-limit 配置项,来设置合理的复制缓冲区大小。设置的依据,就是主节点的数据量大小、主节点的写负载压力和主节点本身的内存大小。 config set client-output-buffer-limit slave 512mb 128mb 60

其中,slave 参数表明该配置项是针对复制缓冲区的。512mb 代表将缓冲区大小的上限设置为 512MB;128mb 和 60 代表的设置是,如果连续 60 秒内的写入量超过 128MB 的话,也会触发缓冲区溢出。

复制积压缓冲区的溢出问题

增量复制时使用的缓冲区称为复制积压缓冲区。

主节点在把接收到的写命令同步给从节点的时候,同时会把这些写命令写入复制积压缓冲区。

主节点在把接收到的写命令同步给从节点时,同时会把这些写命令写入复制积压缓冲区。一旦从节点发生网络闪断,再次和主节点恢复连接后,从节点就会从复制积压缓冲区中读取断连期间主节点接收到的写命令,进而进行增量同步。

首先,复制积压缓冲区是一个大小有限的环形缓冲区。当主节点把复制积压缓冲区写满后,会覆盖缓冲区中的旧命令数据。如果从节点还没有同步这些旧命令数据,就会造成主从节点间重新开始执行全量复制。

其次,为了应对复制积压缓冲区的溢出问题,我们可以调整复制积压缓冲区的大小,也就是设置 repl_backlog_size 这个参数的值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。