本文大部分内容引自《Redis深度历险:核心原理和应用实践》,感谢作者!!!
Redis Info指令用来了解Redis内部一系列的运行参数,使用详细参考官方文档https://redis.io/commands/info
Info指令的作用
1、Server 服务器运行的环境参数
2、Clients 客户端相关信息
3、Memory 服务器运行内存统计数据
4、Persistence 持久化信息
5、Stats 通用统计数据
6、Replication 主从复制相关信息
7、CPU CPU 使用情况
8、Cluster 集群信息
9、KeySpace 键值对统计数量信息
# 获取所有信息
> info
# 获取内存相关信息
> info memory
# 获取复制相关信息
> info replication
Redis每秒执行的指令数
# ops_per_sec: operations per second,也就是每秒操作数
> redis-cli info stats |grep ops
instantaneous_ops_per_sec:789
从命令结果中可以看出ops是789,也就是客户端每秒会发送789条指令到服务器执行;极限情况下Redis可以每秒执行10w次指令,如果qps过高可以考虑通过monitor指令快速观察访问比较频繁的key,从而在相应的业务上进行优化来减少IO次数;monitor指令会瞬间显示出巨量的指令文本,所以在执行完monitor指令后需要立即ctrl + c中断输出
> redis-cli monitor
Redis客户端连接数量
客户端连接数量信息在Clients块里,可以通过info clients看到
> redis-cli info clients
# Clients
connected_clients:124 # 这个就是正在连接的客户端数量
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
客户端连接数量可以排查是否存在意料之外的连接,如果发现客户端连接数量不对,可以使用client list指令列出所有客户端链接地址来确定源头
客户端的数量还可以使用rejected_connections来查看,表示因为超出最大连接数限制而被拒绝的客户端连接次数,如果这个数字很大就意味着服务器最大连接数设置过低需要调整maxclients参数
> redis-cli info stats |grep reject
rejected_connections:0
Redis内存占用
Redis内存占用信息在Memory块里,可以通过info memory指令查看;如果单个Redis内存占用过大并且业务上没有太多压缩空间的话,可以考虑使用集群
> redis-cli info memory | grep used | grep human
used_memory_human:827.46K # 内存分配器 (jemalloc) 从操作系统分配的内存总量
used_memory_rss_human:3.61M # 操作系统看到的内存占用 ,top 命令看到的内存
used_memory_peak_human:829.41K # Redis 内存消耗的峰值
used_memory_lua_human:37.00K # lua 脚本引擎占用的内存大小
复制积压缓冲区
- 概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区
- 复制缓冲区默认数据存储空间大小是1M,由于存储空间大小是固定的,当入队元素的数量大于队列长度时,最先入队的元素会被弹出,而新元素会被放入队列
- 由来:每台服务器启动时,如果开启有AOF或被连接成为master节点,即创建复制缓冲区
- 作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如:set,select)
- 数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中
Redis复制积压缓冲区信息在Replication块里,可以通过info replication指令看到
> redis-cli info replication |grep backlog
repl_backlog_active:0
repl_backlog_size:1048576 # 这个就是积压缓冲区大小
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
1、复制积压缓冲区的大小非常重要,它影响到主从复制的效率;当从库因为网络原因临时断开了主库的复制,然后网络恢复又重新连接上时,这段断开时间内发上在master上的修改操作指令都会放在积压缓冲区中,这样从库可以通过积压缓冲区恢复中断的主从同步过程
2、积压缓冲区也是环形的,后来的指令会覆盖前面的内容;如果从库断开的时间过长或者缓冲区的大小设置太小都会导致从库无法快速中断的主从同步过程,因为中间的修改指令背负改掉了。这时候从库就会进入圈梁同步模式,非常消耗CPU和网络资源
3、如果有多个从库复制,积压缓冲区是共享的,它不会因为从库过多而线性增长;如果实例的修改指令请求很频繁,就需要把积压缓冲区调大一下(大概几十M)
> redis-cli info stats | grep sync
sync_full:0
sync_partial_ok:0
sync_partial_err:0 # 半同步失败次数
通过查看sync_partial_err变量的次数来决定是否需要扩大积压缓冲区,它表示主从半同步复制失败的次数