可能很多开发者都认为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:端口
当发现客户端异常时,就可以使用该命令来关闭异常的连接。
以上是Redis运维之缓冲区的详细内容。更多信息请关注PHP中文网其他相关文章!