Rumah  >  Artikel  >  pangkalan data  >  Redis运维之缓冲区

Redis运维之缓冲区

齐天大圣
齐天大圣asal
2020-05-21 09:28:14188semak imbas

可能很多开发者都认为Redis很简单,掌握些api不就可以了么。事实上,如果使用不当,会出现很多问题的。今天,就来说说redis的缓冲。Redis给客户端提供了输入缓冲区与输出缓冲区,并且提供了相应的api来查看监控缓冲区。

输入缓冲区

Redis为每个客户端都提供了输入缓冲区,它的作用是将客户端发来的命令保存,然后Redis会从输入缓冲区中提取命令并执行。

Redis为客户端提供的输入缓冲区大小是有限制的,不能超过1G内存,超过的话Redis将关闭该客户端。

缓冲区溢出的危害

每个客户端的输入缓冲区最大不能超过1G,超过的话,该客户端将会被关闭,将会造成应用出问题。

输入缓冲区不能大小不受maxmory控制,当maxmory设置为8G时,当Redis已存储了4G数据,而所有客户端的输入缓冲区总大小为5G时,将可能造成数据丢失,键值淘汰,OOM等情况。

缓冲区溢出的原因,是因为redis的处理速度赶不上缓冲区的输入速度。常见的情况是,输入缓冲区内含有大量bigkey或redis发生了阻塞。

监控

监控输入缓冲区有两种方法

  • 第一种方法是通过client list命令来查看目前所有连接的客户端信息

  • 第二种方法是通过info clients命令查看总体的信息。

127.0.0.1:6379> client list
id=113430 addr=127.0.0.1:57244 fd=7 name= age=3115 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
id=113432 addr=127.0.0.1:57250 fd=9 name= age=3099 idle=342 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=set
……

其中,和输入缓冲区有关的是qbuf、qbuf-free,他们分别表示输入缓冲区的大小和剩余的输入缓冲区的大小。

127.0.0.1:6379> info clients
# Clients
connected_clients:4
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

client_recent_max_input_buffer表示最大的输入缓冲区的大小。

这两种方法有自己的优缺点:

  • client list可以精确监控每个客户端情况,但执行速度较慢,有可能造成redis阻塞。

  • info clients 执行快,但分析的数据较简单,不能精确到每个客户端,且不能显示总的客户端输入缓冲区大小,只显示最大的。

输出缓冲区

Redis也提供了输出缓冲区,和输入缓冲区一样,输出缓冲区也不受maxmory控制。

但和输入缓冲区不一样的是,输出缓冲区可以通过配置文件来限制。

client-output-buffer-limit  type hardlimit softlimit secords

  • type表示客户端类型

  • hardlimit  输出缓冲区最大值,超过的话会立即关闭

  • sortlimit 及secords 当超过sortlimit限制secords秒后,客户端会被关闭。

Redis默认配置如下:

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

监控

和输出缓冲区监控的办法一样,也会使用client list及info clients。

client list中和输出缓冲相关的是obl、oll、omem,主要看omem,它表示输出缓冲区的大小。

info clients中client_recent_max_output_buffer表示最大的输出缓冲区大小。

他们的优缺点和之前所说一样,这里就不赘述。

另外这里再介绍一个命令,用来关闭客户端的连接。

client kill ip:端口

当发现客户端异常时,就可以使用该命令来关闭异常的连接。

Atas ialah kandungan terperinci Redis运维之缓冲区. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn