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. 服务器上office不能正常使用?

    (1)确保dll版本和服务器上office版本一致 (2)配置dcom (3)项目配置文件中添加用户模拟语句 <system.web> <identity impersonate=& ...

  2. intellij IDE 破解 简单 License server 法

    http://idea.iteblog.com/key.php

  3. connect() failed (111: Connection refused) while connecting to upstream的解决

    遇到这种情况, 首先 1.检查php-fpm是否启动---------如果没启动->启动, 2.用命令 netstat -ant | grep 9000 查看php-fpm进程,如果没启动-&g ...

  4. Cron 表达式详解

    Crontab Crontab简介 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab&quo ...

  5. Vue.prototype详解

    参考地址:Vue.prototype详解 如果需要设置 全局变量,在main.js中,Vue实例化的代码里添加. 不想污染全局作用域.这种情况下,你可以通过在 原型 上定义它们使其在每个Vue实例中可 ...

  6. 使用PHP 格式化时间

    date 用法: date(格式,[时间]); 如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义: U 替换成从一个起始时间1970年1月1日以来的秒数 <?php ...

  7. LoadRunner(3)

    一.性能测试的策略 重要的:基准测试.并发测试.在线综合场景测试 递增测试.极限测试... 1.基准测试:Benchmark Testing 含义:就是单用户测试,单用户.单测试点.执行n次: 作为后 ...

  8. IDEA常见问题和设置

    1.查看方法的文档:快捷键 Ctrl-Q(Ctrl-J(mac)) 2.历史记录 3.IDEA控制台输出中文乱码问题 4.修改Idea默认的maven等全局设置 5.idea 启动时报错javax.i ...

  9. D. Connected Components Croc Champ 2013 - Round 1 (并查集+技巧)

    292D - Connected Components D. Connected Components time limit per test 2 seconds memory limit per t ...

  10. kotlin变量基础

    kotlin变量与输出 这里看一下在Kotlin中的变量是如何定义的? 编译运行: 对比下我们常用的JAVA语言,定义上的区别: 1.Kotlin变量是统一以var开头,而不区分具体类型,而Java在 ...