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 命令的更多相关文章

  1. Redis 小白指南(二)- 基础命令和五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 基础命令和五大类型:字符串.散列.列表.集合和有序集合 引言 目录 基础命令 字符串类型 散列类型 列表类型 集合类型 有序集合类型 基础命令 1.获得符合规则的键名列表 ...

  2. redis入门指南(七)—— 安全、协议、管理工具及命令属性

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 安全 1.可以使用bind参数绑定一个地址,使redis只接受这个地址的连接. 2.使用requ ...

  3. redis入门指南(二)—— 数据操作相关命令

    写在前面 以下绝大部分内容取材于<redis入门指南>,部分结合个人知识,实践后得出. 只记录重要,明确,属于新知的相关内容,杜绝冗余和重复. 字符串 1.字符串类型是redis中最常见的 ...

  4. redis入门指南(三)—— 事务、过期时间、SORT命令、消息通知与管道

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 事务 1.redis中的事务由一组命令的集合组成,要么都执行,要么都不执行,同时redis的事务 ...

  5. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  6. Redis 小白指南(二)- 聊聊五大类型:字符串、散列、列表、集合和有序集合

    Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合 引言 开篇<Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍>已经介绍了 Redis 的 ...

  7. Kafka深度解析(如何在producer中指定partition)(转)

    原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...

  8. Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍

    Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...

  9. Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

    Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何 ...

随机推荐

  1. expdp / impdp 用法详解 ,和exp / imp 的区别

    一  关于expdp和impdp     使用EXPDP和IMPDP时应该注意的事项:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程 ...

  2. electron之环境安装、启动程序

    1.安装node.js 2.安装淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 3.安装全局electron n ...

  3. arcpy.UpdateCursor和arcpy.da.UpdateCursor计算面积时间的比较

    arcpy.UpdateCursor ####################### import arcpy from arcpy import env import os import sys f ...

  4. [SpringBoot/SpringMVC]从Webapp下载一个大文件出现java.lang.OutOfMemoryError: GC overhead limit exceeded怎么办?

    本文示例工程下载:https://files.cnblogs.com/files/xiandedanteng/WebFileDownload20191026.rar 制作一个Webapp,让其中一个网 ...

  5. 性能调优 | 如何通过性能调优突破 MySQL 数据库性能瓶颈?

    本文出自头条号老王谈运维,转载请说明出处. MySQL 数据库瓶颈对 DBA 程序员而言,是非常棘手的问题.要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里 ...

  6. linux的最简socket编程

    一.背景 好久没有进行linux下的socket编程了,复习一下 二.服务端完整代码 #include <stdio.h> #include <stdlib.h> #inclu ...

  7. 【I·M·U_Ops】------Ⅱ------ IMU自动化运维平台之CMDB

    说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 我理解的 CMDB CMDB翻译过来,Configuratio ...

  8. kotlin数据解构

    fun main(arg: Array<String>) { val person = person("tom") var (name) = person//解构 pr ...

  9. Connection

    作用: * 获取执行sql语句对象 ** createStatement(): 获取Statement对象 ** prepareStatement(String sql): 获取预处理对象 ** pr ...

  10. Flask request 属性详解

    Flask request 属性详解 一.关于request在Flask的官方文档中是这样介绍request的:对于 Web 应用,与客户端发送给服务器的数据交互至关重要.在 Flask 中由全局的 ...