【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell
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的更多相关文章
- 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua
3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...
- Redis 发布订阅,小功能大用处,真没那么废材!
今天小黑哥来跟大家介绍一下 Redis 发布/订阅功能. 也许有的小伙伴对这个功能比较陌生,不太清楚这个功能是干什么的,没关系小黑哥先来举个例子. 假设我们有这么一个业务场景,在网站下单支付以后,需要 ...
- redis小功能大用处-bitmaps
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis学习系列
分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...
- redis学习系列
redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...
- C# Redis学习系列三:Redis配置主从
Redis配置主从 主IP :端口 192.168.0.103 6666 从IP:端口 192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...
- Python操作redis学习系列之(集合)set,redis set详解 (六)
# -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...
随机推荐
- ajax调用c# webservice 如何传递实体参数
后端: 前端: 运行结果: 感觉还是比较简单,只是好久没有写webservice 了,上网找了一下写法
- 为Vim 添加vimgdb支持
为Vim 添加vimgdb支持 1. 下载最新的vim74的源码包 wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.下载vimgdb- ...
- php实现拼图滑块验证的思考及部分实现
实现拼图滑块验证,我觉得其中比较关键的一点就是裁剪图片,最起码需要裁剪出下面两张图的样子 底图 滑块图 一张底图和一张滑块图,其中底图实现起来比较简单可以使用添加水印的方式直接将一张拼图形状的半透明图 ...
- uni-app的H5版使用注意事项
使用方式 打开uni-app项目下的vue文件 点击菜单 运行->运行到浏览器->Chrome 在Chrome內打开调试模式(右键->检查)开启设备模拟,模拟移动设备(如果UI变形刷 ...
- jquery.serializejson.min.js的妙用
关于这个jquery.serializejson.min.js插件来看,他是转json的一个非常简单好用的插件. 前端在处理含有大量数据提交的表单时,除了使用Form直接提交刷新页面之外,经常碰到的需 ...
- springboot有第三方jar打包成jar
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- Flutter 38: 图解 Flutter 基本动画 (二)
小菜前两天学习了以下 Animation 的基本动画,接下来小菜学习以下稍微进阶版的 Animation 动画. 复合动画 小菜前两天学习的主要是基本的单一动画,当然多个动画效果集一身也是毫无问题的, ...
- 多进程之multiprocessing模块和进程池的实现
转载:https://www.cnblogs.com/xiaobeibei26/p/6484849.html Python多进程之multiprocessing模块和进程池的实现 1.利用multip ...
- mysql详解常用命令操作,利用SQL语句创建数据表—增删改查
关系型数据库的核心内容是 关系 即 二维表 MYSQL的启动和连接show variables; [所有的变量] 1服务端启动 查看服务状态 sudo /etc/init.d/mysql status ...
- Win10系统Edge浏览器怎么截取网页长图?
有时我们在工作演示时会需要截取网页上的图片,不过简单的截图可以,但如果需要截取超过屏幕大小的整个网页,你是不是就有些束手无策了.虽然拼接图片也是种方法,但毕竟还是不方便,下面好系统重装助手就教你在Wi ...