首页 > 编程知识 正文

redis缓存策略哪几种(redis中bind)

时间:2023-05-06 08:50:48 阅读:75493 作者:1411

文章目录客户端输入输出缓冲区输入缓冲区如何避免输出缓冲区溢出客户端信息类型输出缓冲区组成部分缓冲区大小设置问题设置内容客户端分类一般客户端设置订阅客户端设置主控的缓冲区复制缓冲区溢出问题复制积压缓冲区溢出问题总结从缓冲区溢出对Redis的影响的角度来看,四个缓冲区本质

缓冲区是用于临时存储命令数据的内存区域,可防止数据和命令的处理速度变慢而导致数据丢失或性能问题。

由于存储器缓冲器的区域有限,如果写入数据的速度持续快于从中读取数据的速度,则缓冲存储器会不断变大,如果超过上限值(如果不设置上限,则Redis存储器将耗尽并崩溃),则缓冲存储器会变大

缓冲区在Redis中的应用场景如下:

客户端输入/输出缓冲区为每个连接的客户端设置输入/输出缓冲区,以避免客户端和服务端请求与速度不匹配。

输入缓冲临时指令,主线程从输入缓冲区读出指令并完成处理后,写入输出缓冲区,通过输出缓冲区发送到客户端,输入缓冲区溢出时

已写入bigkey。 例如,一次多个百万级集合数据服务器的请求处理速度太慢。 使用CLIENT LIST命令:可以查看连接到服务器端的每个客户端的输入缓冲区的使用情况,包括主线阻塞

addr:显示不同客户端的IP和端口号cmd:客户端上次执行的命令qbuf:缓冲区已使用的大小。 qbuf-free:输入缓冲区未使用大小如果qbuf较大且qbuf-free较小,则表示没有太多可用空间,大量写入命令将导致客户端缓冲区溢出、Redis

避免增大缓冲区的方法。 在默认的1G中,不能增大。 这个大小在大部分情况下都足够了。 数据命令的发送和处理速度。 也就是说,对于避免向bigkey的写入和避免Redis主线程引起的输出缓冲器溢出,客户端信息的类型简单且返回一定大小的OK响应,或者错误信息的大小不一定。 包含具体数据的执行结果输出缓冲器的构成要素的大小是16KB的固定缓冲器。 临时保存OK和错误信息动态增加的缓冲区,在溢出大小可变的响应结果时,服务端返回bigkey的大量结果并执行MONITOR命令。 输出结果继续占用输出缓冲区,最终发生溢出。 减少不正确使用缓冲区设置。 使用client-output-buffer-limit设置适当的缓冲区大小上限,或缓冲区连续写入时间和写入量上限。 缓冲区大小设置问题设置内容设置缓冲区大小上限设置输出缓冲区持续写入数据数上限阈值和持续写入数据时间上限阈值客户端分类一般客户端:订阅客户端,与Redis服务端交换读写命令订阅的订阅客户端是节点客户端:用于与从节点进行数据同步的常规客户端是用于设置客户端- ou的tput-buffer-limit Norma l00 normal,通常设置为当前在普通客户端上,每次提交一个请求时,都要等待请求的结果返回,然后再发送下一个请求。 这种发送方法称为阻塞发送。

在这种情况下,服务器端的输出缓冲区通常不会被阻止,除非读取卷是特别大的bigkey。

将常规客户端的缓冲区大小限制、持续写入量限制和持续写入时间限制设置为0。 也就是说,没有限制。

配置订阅客户端当订阅的Redis通道上有消息时,服务端会通过输出缓冲区向客户端发送消息。

订阅客户端和服务器之间的消息发送方式不是块发送。

通道消息越多,输出缓冲区的容量也越大。

client-output-buffer-limit pubsub8mb2 MB 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 的 话,也会触发缓冲区溢出。

我们再继续看看这个设置对我们有啥用。假设一条写命令数据是 1KB,那么,复制缓冲区 可以累积 512K 条(512MB/1KB = 512K)写命令。同时,主节点在全量复制期间,可以 承受的写命令速率上限是 2000 条 /s(128MB/1KB/60 约等于 2000)。

这样一来,我们就得到了一种方法:在实际应用中设置复制缓冲区的大小时,可以根据写
命令数据的大小和应用的实际负载情况(也就是写命令速率),来粗略估计缓冲区中会累
积的写命令数据量;然后,再和所设置的复制缓冲区大小进行比较,判断设置的缓冲区大
小是否足够支撑累积的写命令数据量。

关于复制缓冲区,我们还会遇到一个问题。主节点上复制缓冲区的内存开销,会是每个从
节点客户端输出缓冲区占用内存的总和。如果集群中的从节点数非常多的话,主节点的内
存开销就会非常大。所以,我们还必须得控制和主节点连接的从节点个数,不要使用大规
模的主从集群。

好了,我们先总结一下这部分的内容。为了避免复制缓冲区累积过多命令造成溢出,引发
全量复制失败,我们可以控制主节点保存的数据量大小,并设置合理的复制缓冲区大小。
同时,我们需要控制从节点的数量,来避免主节点中复制缓冲区占用过多内存的问题。

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

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

看到这里你是不是感觉有些熟悉?没错,我们在第 6 讲时已经学过复制积压缓冲区了, 只不过我当时告诉你的是它的英文名字 repl_backlog_buffer。所以这一讲,我们从缓冲区
溢出的角度再来回顾下两个重点:复制积压缓冲区溢出的影响,以及如何应对复制积压缓
冲区的溢出问题。
首先,复制积压缓冲区是一个大小有限的环形缓冲区。当主节点把复制积压缓冲区写满
后,会覆盖缓冲区中的旧命令数据。如果从节点还没有同步这些旧命令数据,就会造成主
从节点间重新开始执行全量复制。

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

总结 从缓冲区溢出对 Redis 的影响的角度,四个缓冲区

缓冲区溢出导致网络连接关闭:普通客户端、订阅客户端,以及从节点客户端,它们使 用的缓冲区,本质上都是 Redis 客户端和服务器端之间,或是主从节点之间为了传输命 令数据而维护的。这些缓冲区一旦发生溢出,处理机制都是直接把客户端和服务器端的 连接,或是主从节点间的连接关闭。网络连接关闭造成的直接影响,就是业务程序无法 读写 Redis,或者是主从节点全量同步失败,需要重新执行。

缓冲区溢出导致命令数据丢失:主节点上的复制积压缓冲区属于环形缓冲区,一旦发生溢出,新写入的命令数据就会覆盖旧的命令数据,导致旧命令数据的丢失,进而导致主从节点重新进行全量复制。

本质

缓冲区溢出,无非就是三个原因:

命令数据发送过快过大;命令数据处理较慢;缓冲区空间过小。

明白了这哥,我们就可以有针对性地拿出应对策略了。

针对命令数据发送过快过大的问题,对于普通客户端来说可以避免 bigkey,而对于复制 缓冲区来说,就是避免过大的 RDB 文件。针对命令数据处理较慢的问题,解决方案就是减少 Redis 主线程上的阻塞操作,例如使 用异步的删除操作。针对缓冲区空间过小的问题,解决方案就是使用 client-output-buffer-limit 配置项设 置合理的输出缓冲区、复制缓冲区和复制积压缓冲区大小。当然,我们不要忘了,输入缓冲区的大小默认是固定的,我们无法通过配置来修改它,除非直接去修改 Redis 源 码。

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