24-拓展 2:无所不知 —— Info 指令
课程
1
开篇:授人以鱼不若授人以渔 —— Redis 可以用来做什么?
学习时长: 5分21秒
2
基础:万丈高楼平地起 —— Redis 基础数据结构
上次学到
学习时长: 16分14秒
3
应用 1:千帆竞发 —— 分布式锁
学习时长: 7分47秒
4
应用 2:缓兵之计 —— 延时队列
学习时长: 8分9秒
5
应用 3:节衣缩食 —— 位图
学习时长: 8分52秒
6
应用 4:四两拨千斤 —— HyperLogLog
学习时长: 14分17秒
7
应用 5:层峦叠嶂 —— 布隆过滤器
学习时长: 17分54秒
8
应用 6:断尾求生 —— 简单限流
学习时长: 4分37秒
9
应用 7:一毛不拔 —— 漏斗限流
学习时长: 7分22秒
10
应用 8:近水楼台 —— GeoHash
学习时长: 7分52秒
11
应用 9:大海捞针 —— Scan
学习时长: 8分42秒
12
原理 1:鞭辟入里 —— 线程 IO 模型
学习时长: 4分1秒
13
原理 2:交头接耳 —— 通信协议
学习时长: 3分34秒
14
原理 3:未雨绸缪 —— 持久化
学习时长: 5分27秒
15
原理 4:雷厉风行 —— 管道
学习时长: 3分51秒
16
原理 5:同舟共济 —— 事务
学习时长: 6分36秒
17
原理 6:小道消息 —— PubSub
学习时长: 7分7秒
18
原理 7:开源节流 —— 小对象压缩
学习时长: 7分14秒
19
原理 8:有备无患 —— 主从同步
学习时长: 4分9秒
20
集群 1:李代桃僵 —— Sentinel
学习时长: 3分52秒
21
集群 2:分而治之 —— Codis
学习时长: 7分28秒
22
集群 3:众志成城 —— Cluster
学习时长: 8分38秒
23
拓展 1:耳听八方 —— Stream
学习时长: 13分40秒
24
拓展 2:无所不知 —— Info 指令
学习时长: 4分4秒
25
拓展 3:拾遗补漏 —— 再谈分布式锁
学习时长: 2分18秒
26
拓展 4:朝生暮死 —— 过期策略
学习时长: 2分21秒
27
拓展 5:优胜劣汰 —— LRU
学习时长: 4分34秒
28
拓展 6:平波缓进 —— 懒惰删除
学习时长: 2分13秒
29
拓展 7:妙手仁心 —— 优雅地使用 Jedis
学习时长: 6分35秒
30
拓展 8:居安思危 —— 保护 Redis
学习时长: 2分19秒
31
拓展 9:隔墙有耳 —— Redis 安全通信
学习时长: 6分34秒
32
拓展 10:法力无边 —— Redis Lua 脚本执行原理
学习时长: 9分24秒
33
拓展 11:短小精悍 —— 命令行工具的妙用
学习时长: 9分21秒
34
源码 1:丝分缕析 —— 探索「字符串」内部
学习时长: 5分20秒
35
源码 2:循序渐进 —— 探索「字典」内部
学习时长: 7分24秒
36
源码 3:挨肩迭背 —— 探索「压缩列表」内部
学习时长: 10分42秒
37
源码 4:风驰电掣 —— 探索「快速列表」内部
学习时长: 3分49秒
38
源码 5:凌波微步 —— 探索「跳跃列表」内部
学习时长: 9分57秒
39
源码 6:破旧立新 —— 探索「紧凑列表」内部
学习时长: 2分42秒
40
源码 7:金枝玉叶 —— 探索「基数树」内部
学习时长: 5分36秒
41
源码 8:精益求精 —— LFU vs LRU
学习时长: 8分4秒
42
源码 9:如履薄冰 —— 懒惰删除的巨大牺牲
学习时长: 9分53秒
43
源码 10:跋山涉水 —— 深入字典遍历
学习时长: 9分24秒
44
源码 11:见缝插针 —— 探索 HyperLogLog 内部
学习时长: 13分3秒
45
尾声:百尺竿头 —— 继续深造指南
学习时长: 2分32秒
juejin_logo copyCreated with Sketch.

拓展 2:无所不知 —— Info 指令

在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,你可以清晰地知道 Redis 内部一系列运行参数。

Info 指令显示的信息非常繁多,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:

  1. Server 服务器运行的环境参数
  2. Clients 客户端相关信息
  3. Memory 服务器运行内存统计数据
  4. Persistence 持久化信息
  5. Stats 通用统计数据
  6. Replication 主从复制相关信息
  7. CPU CPU 使用情况
  8. Cluster 集群信息
  9. KeySpace 键值对统计数量信息

Info 可以一次性获取所有的信息,也可以按块取信息。

# 获取所有信息
> info
# 获取内存相关信息
> info memory
# 获取复制相关信息
> info replication

考虑到参数非常繁多,一一说明工作量巨大,下面我只挑一些关键性的、非常实用和最常用的参数进行详细讲解。如果读者想要了解所有的参数细节,请参考阅读 Redis 官网文档

Redis 每秒执行多少次指令?

这个信息在 Stats 块里,可以通过 info stats 看到。

# ops_per_sec: operations per second,也就是每秒操作数
> redis-cli info stats |grep ops
instantaneous_ops_per_sec:789

以上,表示 ops 是 789,也就是所有客户端每秒会发送 789 条指令到服务器执行。极限情况下,Redis 可以每秒执行 10w 次指令,CPU 几乎完全榨干。如果 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 内存占用多大 ?

这个信息在 Memory 块里,可以通过 info memory 看到。

> 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 脚本引擎占用的内存大小

如果单个 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

复制积压缓冲区大小非常重要,它严重影响到主从复制的效率。当从库因为网络原因临时断开了主库的复制,然后网络恢复了,又重新连上的时候,这段断开的时间内发生在 master 上的修改操作指令都会放在积压缓冲区中,这样从库可以通过积压缓冲区恢复中断的主从同步过程。

积压缓冲区是环形的,后来的指令会覆盖掉前面的内容。如果从库断开的时间过长,或者缓冲区的大小设置的太小,都会导致从库无法快速恢复中断的主从同步过程,因为中间的修改指令被覆盖掉了。这时候从库就会进行全量同步模式,非常耗费 CPU 和网络资源。

如果有多个从库复制,积压缓冲区是共享的,它不会因为从库过多而线性增长。如果实例的修改指令请求很频繁,那就把积压缓冲区调大一些,几十个 M 大小差不多了,如果很闲,那就设置为几个 M。

> redis-cli info stats | grep sync
sync_full:0
sync_partial_ok:0
sync_partial_err:0  # 半同步失败次数

通过查看sync_partial_err变量的次数来决定是否需要扩大积压缓冲区,它表示主从半同步复制失败的次数。

思考

平时你们在使用 Redis 时还需要查看哪些重要的信息,能不能直接在 Info 信息里获取?

留言
Ctrl + Enter
全部评论(25)
BinK_1783的头像
删除
所谓自由,不是随心所欲,而是自我主宰
点赞
回复
吴宇晨的头像
删除
后端开发 @ xxx
请问文章里的图是什么项目来的
点赞
回复
zyfsuzy的头像
删除
研发工程师 @ 百度
中间这些咋这么水昵
7
回复
春天百花开的头像
删除
最大key占用的内存数
最长处理时间+处理指令
各类型key的数量,占用空间
范围查询占用空间的key
最频繁访问的key,最少访问的key。 可以根据访问次数范围进行查询
每个db占用内存数
1
回复
钱同志的头像
删除
info 指令确实强大
有没有直接看慢操作的指令?
有没有直接定位大key的指令?
有没有直接定位热key的指令?
如果有,单机和集群都支持嘛?
点赞
1
删除
slowlog get可以查看慢操作;定位大key可以使用redis-cli --bigkeys或者使用rdb工具分析rdb文件;看热key只能临时打开下monitor吧
1
回复
老虎不想说话58398的头像
删除
执行info commandstats 发现命令执行的次数越多,每条命令平均耗费的cpu时间越少。
点赞
回复
刘子平的头像
删除
运维开发工程师
redis的缓存命中率也是非常重要的信息,不知道老师有没有好的方式查看
3
1
删除
读取一个键之后(读操作和写操作都要对键进行读取),服务器会根据键是否存在来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO status 命令的keyspace_hits属性和keyspace_misses属性中查看。——redis设计与实现
点赞
回复
LiangDu的头像
删除
info指令介绍的有点少 老师
点赞
回复
木_木的头像
删除
JAVA @ 稳健医疗
这个info指令所展示的数据,是指当前这个单机的redis还是整个集群的redis数据呢?如果是当前单台的redis,那M-S和Cluster模式下,Info指令是否支持获取全局的性能数据信息?
1
1
删除
(作者)
获取的是单机的数据,集群信息可以通过cluster info指令获取
点赞
回复
zhangz_leo的头像
删除
PHP、Golang
Info 指令显示的信息非常繁多,分为 8 大块,每个块都有非常多的参数,这 8 个块分别是:
好像是9大块
点赞
1
删除
(作者)
感谢指正,已修改
点赞
回复
LeGrandmechantRenard的头像
删除
想吃软饭 @ 某支付公司
这个就是复制积压缓冲区 就是主从那个主缓冲区吧。那么这个缓冲区 满了之后 如何清除的呢,是过期策略么?
点赞
1
删除
文章中说了是环形的,后来的指令会覆盖掉前面的内容
点赞
回复
yellowb42621的头像
删除
请问一般在互联网公司里redis的部署结构是1 master + 多少个 slave?您前面的章节有提到Redis占用的内存太大的话宕机重启会慢,那么是否有关于配置多大内存的最佳实践?
点赞
5
删除
(作者)
我们最大内存一般设置为20g
点赞
回复
删除
(作者)
不够的话就集群化
点赞
回复
查看更多回复
蒋海博的头像
删除
复制积压缓冲区多大?后面是挤压缓冲?错别字吗😊
点赞
1
删除
(作者)
嗯,是错别字,谢谢真正
点赞
回复