Redis 使用指南:深度解析 info 命令
Redis 是一个使用 ANSI C 编写的开源、基于内存、可选持久性的键值对存储数据库,被广泛应用于大型电商网站、视频网站和游戏应用等场景,能够有效减少数据库磁盘 IO, 提高数据查询效率,减轻管理维护工作量,降低数据库存储成本。对传统磁盘数据库是一个重 要的补充,成为了互联网应用,尤其是支持高并发访问的互联网应用必不可少的基础服务之一。它的主要优势有以下几方面:
- 首先性能极高,正因为是内存型数据库,读写操作全在内存进行,因此 Redis 读写的速度能到 10 万 ops。
- Redis 相对于其它内存数据库,还提供丰富的数据接口:如字符串(strings), 散列
(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 等,设置包括 bitmaps,hyperloglogs 和 地理空间(geo)操作查询。这也许是大多数开发者相对于其它内存数据库选择 Redis 一个重要原因。
- 虽然是内存型数据库,但它也提供持久化功能。
Redis 目前在 DB-Engines Ranking(https://db-engines.com/en/ranking)排名第 7,几乎所有的公有云平台都提供了 Redis 服务。虽然 Redis 性能高,但我们平时在使用 Redis 的过程中,也应该关注其运行时的状态,根据这些信息,我们一方面可以优化使用 Redis 的方法,另一方面当应用程序出现超时、响应极慢的情况时,可以进行分析。
到这里,就必须要说到 Redis 提供的一个非常有用的查看状态信息的命令:info,使用 redis-cli 连上 redis,输入 info all 命令,redis-server 就会返回 Redis 的状态信息,详细内容如下:
参数名 |
说明 |
||
server |
获取 server 信息,包括 version, OS, port 等信息 |
||
clients |
获取 clients 信息,如客户端连接数等 |
||
memory |
获取 server 的内存信息,包括当前内存消耗、内存使用峰值 |
||
persistence |
获取 server 的持久化配置信息 |
||
stats |
获取 server 的一些基本统计信息,如处理过的连接数量等 |
||
replication |
获取 server 的主从配置信息 |
||
cpu |
获取 server 的 CPU 使用信息 |
||
keyspace |
获取 server 中各个 DB 的 key 的数量 |
||
cluster |
获取集群节点信息,仅在开启集群后可见 |
commandstas |
获取每种命令的统计信息 |
其中 memory,stats,clients,keyspace 是 Redis 运行时经常要关注的信息,能
够有效帮我们本文重点对这四栏中我们需要详细了解的信息。
一、深度剖析 Redis 最重要的 memory
对于 Redis 来说,内存是最重要的资源,所以本文首先介绍 Redis 内存状态信息怎么查看, 也就是 memory 这一栏:
- used_memory:Redis 分配器分配的内存量,也就是实际存储数据的内存总量。
- used_memory_human:以可读格式显示 used_memory。
- used_memory_rss:以操作系统的角度,显示 Redis 进程占用的总物理内存。
- used_memory_rss_human:以可读格式显示 used_memory_rss
- mem_fragmentation_ratio:used_memory_rss /used_memory 比值,表示内存碎片率。其中 used_memory 反映了当前 Redis 存储数据的内存使用情况,当内存使用率达到
Redis 设置的 maxmemory 时,Redis 就会根据设置内存数据逐出策略,以不同的方式移除存储在内存中的数据。比如,如果设置的策略为 noeviction,那么 Redis 会直接返回错误提示。
mem_fragmentation_ratio 表示的内存碎片率,理解这一指标,对优化 Redis 实例的资源性能是非常重要的。内存碎片率稍大于 1 是比较合理的范围,此时内存碎片率还比较低,同时也说明 Redis 没有发生 swap。但如果内存碎片率的值超过了 1.5,那就说明
Redis 消耗了实际需要物理内存的 150%,其中有 50%是内存碎片率,可以直接判定为
Redis 内存碎片过大。内存碎片率是不是越低就越好呢?答案是否定的。当内存碎片率低于 1 时,说明 Redis 内存分配超出了物理内存,操作系统正在进行 swap,Redis 可能会把部分数据交换到硬盘上。swap 会严重影响 Redis 的性能,造成极大的延迟。
二、stats 帮你全面理解 Redis 状态
stats 可以统计 Redis 的基础信息,比如 Redis 的连接数、命令、网络、同步状态等非常重要的信息。下面介绍以下几个比较重要的信息:
- total_connections_received:连接过的客户端总数。
- total_commands_processed:处理过的命令总数。
- instantaneous_ops_per_sec:每秒处理的命令数。
- keyspace_hits:keyspace 命中次数。
- keyspace_misses:keyspace 未命中次数。
- rejected_connections:由于 maxclients 限制而拒绝的连接数量。
- expired_keys:key 过期事件的总数。
- evicted_keys:由于 maxmemory 限制,而被回收内存的 key 的总数。
total_connections_received 和 total_commands_processed 反映了 Redis 服务器自从启动以来,所有处理过的连接数和命令数。instantaneous_ops_per_sec 反应了 Redis 服务器的忙碌状态。当 rejected_connections 的值不为 0 时,说明应用的连接数过多, 或者 maxclients 配置的太小。
对于应用来说, keyspace_hits 和 keyspace_misses 这两项指标是非常关键的。
Redis 对其所有的命令都设置了专门的标识属性,如“只读”,“写”或者“管理命令”之类,在 Redis 源码中,查看一下 redisCommand 结构体中 sflags 成员属性字段,就可以知道这个命令是具有哪些属性。比如,w 表示一个写命令(如 set,del 命令),r 表示是一个只读命令( get , hmget 命令), a 则表示一个管理命令(config,shutdown) 。其中
keyspace_hits 和 keyspace_misses 都是针对具备只读属性的 Redis 操作命令做统计,如果 info 统计出来的 keyspace_misses 值过高,或者在过去一段时间内增长很快,那么就说明这一段时间从 Redis 中获取数据都没有拿到,这时也许就需要检查一下应用数据在
Redis 中的存放和访问情况了。如果 key 在明确的时间周期内被使用,或者旧的 key 将来可能不会被使用,就可以用 Redis 过期时间命令(expire,expireat, pexpire, pexpireat 等)去设置过期时间,这样 Redis 就会在 key 过期时自动删除 key,这个信息可以通过
expired_keys 去查看。当内存使用达到设置的最大阀值 maxmemory 时,Redis 则会根据设置的 key 逐出策略,淘汰 Redis 中存储的数据,这个信息可以根据 evicted_keys 查看。
三、解读 Redis 连接数的意义
clients 包含了连接数,输入输出缓冲和阻塞命令连接数等情况。
- connected_clients:客户端连接的数量。
- client_longest_output_list:当前的客户端连接之中最长的输出列表。
- client_biggest_input_buf:当前的客户端连接之中最大的输入缓冲区。
- blocked_clients:由于阻塞调用(BLPOP、BRPOP、BRPOPLPUSH)而等待的客户端的数量。
连接数其实对于 Redis 来说可以看做是一种有限资源,一般 Redis 都配置有最大连接
数 限 制 , 因 此 了 解 这 个 对 于 确 保 应 用 正 常 连 接 也 是 相 当 重 要 的 。
client_longest_output_list 过高则很可能说明现在 Redis 出现了异常,可能要结合clients list 来排查客户端连接情况。使用了阻塞命令时,blocked_clients 也需要重点关注。
四、Keyspace 帮你了解数据状态
Keyspace 主要提供关于每个 Redis 数据库的主字典的统计数据。这些统计数据包括键的数量、具有过期时间的 key 的数量和平均生存时间。对于每个数据库来说,
keyspace 栏显示的每行信息格式如下所示: dbX: keys=X,expires=X,avg_ttl=X
其中,第一个 X 表示数据库的编号,第二个 X 表示键的数量,第三个 X 表示具有过期时间的键的数量,第四个 X 表示键的平均生存时间。举个例子:
db0:keys=6,expires=0,avg_ttl=0:这就表示当前数据库 0 的 key 总数有 6 个,带有过期时间的 key 总数 0 个,平均存活时间为 0。
Redis Info 命令的其它信息,在这里也简要介绍一下:如 server 栏,是会显示关于 Redis 服务器自身的一些信息, 如版本号, 操作系统, 端口等。Persistence 和
replication 则与数据库持久化和主备复制有关,cpu 反映了 Redis 服务器 CPU 使用信息,
commandstas 是显示 Redis 所有命令执行的详细信息,包括命令调用次数、命令消耗的
CPU 时间总量、每次执行命令消耗 CPU 时间的平均值。Cluster 主要用来反应集群特性。关于更多 Redis 的使用指南,可以到华为云 Redis 官网上了解,也可以试用免费的
Redis , 来 体 验 一 下 内 存 数 据 库 的 使 用 感 受 :
http://www.huaweicloud.com/product/dcs.html。分布式缓存服务 DCS 是华为云上的
Redis 内存数据库服务,基于双机热备的高可用架构,拥有丰富的缓存类型,能够很好地满足用户高读写性能及快速数据访问的业务诉求。分布式缓存服务能够有效加快应用的处 理速度,提升热点数据访问速度,大幅降低数据库读写频率,降低业务对整体架构的压力, 具有高可靠、在线扩展、一键运维等特点。
Redis 使用指南:深度解析 info 命令的更多相关文章
- Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...
- redis入门指南(七)—— 安全、协议、管理工具及命令属性
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 安全 1.可以使用bind参数绑定一个地址,使redis只接受这个地址的连接. 2.使用requ ...
- redis入门指南(二)—— 数据操作相关命令
写在前面 以下绝大部分内容取材于<redis入门指南>,部分结合个人知识,实践后得出. 只记录重要,明确,属于新知的相关内容,杜绝冗余和重复. 字符串 1.字符串类型是redis中最常见的 ...
- redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道
写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 事务 1.redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务 ...
- Kafka深度解析
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...
- Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合
Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...
- Kafka深度解析(如何在producer中指定partition)(转)
原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...
- Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍
Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...
- Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间
Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何 ...
随机推荐
- expdp / impdp 用法详解 ,和exp / imp 的区别
一 关于expdp和impdp 使用EXPDP和IMPDP时应该注意的事项:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程 ...
- electron之环境安装、启动程序
1.安装node.js 2.安装淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 3.安装全局electron n ...
- arcpy.UpdateCursor和arcpy.da.UpdateCursor计算面积时间的比较
arcpy.UpdateCursor ####################### import arcpy from arcpy import env import os import sys f ...
- [SpringBoot/SpringMVC]从Webapp下载一个大文件出现java.lang.OutOfMemoryError: GC overhead limit exceeded怎么办?
本文示例工程下载:https://files.cnblogs.com/files/xiandedanteng/WebFileDownload20191026.rar 制作一个Webapp,让其中一个网 ...
- 性能调优 | 如何通过性能调优突破 MySQL 数据库性能瓶颈?
本文出自头条号老王谈运维,转载请说明出处. MySQL 数据库瓶颈对 DBA 程序员而言,是非常棘手的问题.要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里 ...
- linux的最简socket编程
一.背景 好久没有进行linux下的socket编程了,复习一下 二.服务端完整代码 #include <stdio.h> #include <stdlib.h> #inclu ...
- 【I·M·U_Ops】------Ⅱ------ IMU自动化运维平台之CMDB
说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 我理解的 CMDB CMDB翻译过来,Configuratio ...
- kotlin数据解构
fun main(arg: Array<String>) { val person = person("tom") var (name) = person//解构 pr ...
- Connection
作用: * 获取执行sql语句对象 ** createStatement(): 获取Statement对象 ** prepareStatement(String sql): 获取预处理对象 ** pr ...
- Flask request 属性详解
Flask request 属性详解 一.关于request在Flask的官方文档中是这样介绍request的:对于 Web 应用,与客户端发送给服务器的数据交互至关重要.在 Flask 中由全局的 ...