Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析、功能强大的Redis Shell、Pipeline、事务与Lua脚本、Bitmaps、HyperLogLog、发布订阅、GEO等附加功能,这些功能可以在某些场景发挥重要作用。

  • 慢查询分析:通过慢查询分析,找出有问题的命令进行优化;
  • Redis Shell:功能强大的Redis Shell会有意想不到的使用功能;
  • Pipeline:通过Pipeline(管道或者流水线)机制有效提高客户端性能;
  • 事务与Lua:制作自己的专属原子命令;
  • Bitmaps:通过在字符串数据结构上使用位操作,有效节省内存,为开发提供了新思路;
  • HyperLogLog:一种基于概率的新算法,难以想象地节省内存空间;
  • 发布订阅:基于发布订阅的消息通信机制;
  • GEO:Redis 3.2提供了基于地理位置信息的功能。

1、慢查询分析

许多存储系统(例如Mysql)提供慢查询日志帮助开发人员和运维人员定位系统中存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令执行的时间,当超过预设阈值,就将这条命令的相关信息(例如:发生时间、耗时、命令的详细信息)记录下来,Redis也提供了类似功能。

如图3-1所示,Redis客户端执行一条命令分为如下4个部分:

  • 发送命令
  • 命令排队
  • 命令执行
  • 返回结果

注意,慢查询只统计步骤3的时间,所以没有慢查询并不代表客户端没有超时问题。

1.1 慢查询的两个配置参数

对于慢查询功能,需要明确两件事:

  • 预设阈值怎么设置?
  • 慢查询记录存在在哪?

Redis提供了slowlog-log-slower-than和slowlog-max-len配置来解决这两个问题。从字面意思就可以看出,slowlog-log-slower-than就是预设的阈值,它的单位是微秒(1秒=1000毫秒=1000 000微秒),默认值时10 000,假如执行了一条“很慢”的命令(例如keys *),如果它的执行时间超过了10 000微秒,那么它将被记录在慢查询日志中。slowlog-max-len只说明了慢查询日志最多能存储多少条,并没有说明存放在哪里,实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是这个列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当查询日志列表已处于其最大长度时,最早插入的一个命令将被从列表中移出。例如slowlog-max-len设置为5,当有第6条慢查询日志插入时,则队头的第一条数据就会出列,第6条慢查询就会入列。

在Redis中有两种修改配置的方法,一种是修改配置文件,另一种就是使用config set 命令动态修改。例如下面使用config set 命令将slowlog-log-slower-than设置为20 000微秒,slowlog-max-len设置为1000。

 config set slowlog-log-slower-than
config set slowlog-max-len
config rewrite

如果要Redis将配置持久化到本地配置文件,需要执行 config rewrite 命令。

虽然慢查询日志是存放在Redis内存列表中的,但是Redis并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理。下面就介绍这几个命令。

(1)获取慢查询日志

 slowlog get [n]

下面的操作返回当前Redis的慢查询,参数n可以指定条数:

可以看到每个慢查询日志有4个属性组成,分别是慢查询日志的标识id、发生时间戳、命令耗时和参数。

(2)获取慢查询日志列表当前长度

 slowlog len

(3)慢查询日志重置

 slowlog reset

实际上reset命令是对列表做清理操作。

1.2 慢查询总结

慢查询功能可以有效的帮助我们找到Redis可能存在的瓶颈,但在实际使用过程中还需要注意一下几点:

(1)slowlog-max-len配置建议:线上建议加大慢查询列表,记录慢查询时Redis会对常命令做阶段操作,并不会占用大量内存。慢查询列表可以减缓查询被剔除的可能,例如线上可设置为1000以上。

(2)slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis的并发量对该值进行调整。由于Redis采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么Redis最多可支撑QPS不到1000。因此对于高QPS场景的Redis建议设置为1毫秒。

(3)慢查询只记录命令查询时间,并不包括命令排队和网络传输时间。为此客户端执行命令的时间会大于实际执行时间。因为命令执行排队机制,慢查询会导致其它命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。

(4)由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能丢失部分慢查询命令,为了防止这种情况的发生,可以定期执行slow get 命令将慢查询日志持久化到其它存储中(例如Mysql),然后可以制定可视化界面进行查询。

2、Redis Shell

Redis提供了redis-cli、redis-server、redis-benchmark等Shell工具。

[待补充]

【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell的更多相关文章

  1. 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua

    3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...

  2. Redis 发布订阅,小功能大用处,真没那么废材!

    今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...

  3. redis小功能大用处-bitmaps

  4. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  5. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  6. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  7. redis学习系列

    redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...

  8. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  9. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

随机推荐

  1. jemeter鬓发压力测试包

    使用: 为子线程添加响应时间:https://www.cnblogs.com/duanxz/p/5464993.html 结果查看分析:聚合报告在监听器里面: https://wenku.baidu. ...

  2. 基于MFC对话框的2048游戏

    在之前一篇<简单数字拼板游戏学习>基础上修改,地址:http://www.cnblogs.com/fwst/p/3706483.html 开发环境:Windows 7/ Visual St ...

  3. 梯度直方图(HOG,Histogram of Gradient)

    1.介绍 HOG(Histogram of Oriented Gradient)是2005年CVPR会议上,法国国家计算机科学及自动控制研究所的Dalal等人提出的一种解决人体目标检测的图像描述子,该 ...

  4. CPU vector operations

    CPU vector operations 原文:https://blog.csdn.net/wangeen/article/details/8602028 vector operations 是现代 ...

  5. 使用cublas 矩阵库函数实现矩阵相乘

    2014-08-10 cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的.处理方法可参考下面的注释代码 // SOME ...

  6. ant-design的Table组件自定义空状态

    Table,是antd中一个我们经常使用的组件,在官方文档中给出了非常详细的实例以及API, 但在我们在使用过程中可能需要根据项目的要求来定制空状态时的展示. 什么是空状态呢? 在antd的官方文档中 ...

  7. ES5中一些重要的拓展

    1.对象的拓展 ①Object.create(obj, {age:{value:18, writable:true, configurable:true, enumerable:true}); 以指定 ...

  8. 关于google开源的Material Design说明

    原文地址:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/wiki/Getting-Started 源码地址:h ...

  9. 【python】python _、__、__xx__之间的差别

    本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...

  10. TF版网络模型搭建常用代码备忘

    本文主要介绍如何搭建一个网络并训练 最近,我在写代码时经常碰到这样的情况,明明记得代码应该怎么写,在写出来的代码调试时,总是有些小错误.原因不是接口参数个数不对,就是位置不对.为了节约上网查找时间,现 ...