一、慢查询分析(查询日志:所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功能。)

Redis客户端执行一条命令分为如下4个部分:1)发送命令  2)命令排队  3)命令执行  4)返回结果

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

1、慢查询参数配置:

·预设阀值怎么设置?(slowlog-log-slower-than)

(它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000,假如执行了一条“很慢”的命令(例如keys*),如果它的执行时间超过了10000微秒,那么它将被记录在慢查询日志中)

·慢查询记录存放在哪?(slowlog-max-len)

(实际上Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。一个新的命令满足慢查询条件时被插入到这个列表中,当慢查询日志列表已处于其最大长度时,最早插入的一个命令将从列表中移出,例如slowlog-max-len设置为5,当有第6条慢查询插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列)

2、在Redis中有两种修改配置的方法,一种是修改配置文件,另一种是使用config set命令动态修改。

例如下面使用config set命令将slowlog-log-slower-than设置为20000微秒,slowlog-max-len设置为1000:

config set slowlog-log-slower-than 20000

config set slowlog-max-len 1000

config rewrite

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

3、慢查询日志的访问和管理

虽然慢查询日志是存放在列表中的,但redis并没有暴露这个键,而是通过一组命令来实现对慢查询日志的访问和管理:

·获取慢查询日志 slowlog get [n] 参数n可以指定条数

·获取慢查询日志列表当前的长度 slowlog len

·慢查询日志重置 slowlog reset 实际是对列表做清理操作

4、最佳实践:

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

1、·slowlog-max-len配置建议:线上建议调大慢查询列表,记录慢查询时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以

减缓慢查询被剔除的可能,例如线上可设置为1000以上。

2、·slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值。由于Redis采用单线程响应命令,对于高流

量的场景,如果命令执行时间在1毫秒以上,那么Redis最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒。

3、·慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机

制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。

4、·由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期

执行slow get命令将慢查询日志持久化到其他存储中(例如MySQL),然后可以制作可视化界面进行查询,

二、Redis Shell(Redis提供了redis-cli、redis-server、redis-benchmark等Shell工具它们虽然比较简单,但是麻雀虽小五脏俱全,有时可以很巧妙地解决一些问题)

1、redis-cli

-r(-r(repeat)选项代表将命令执行多次,例如下面操作将会执行三次ping命令: redis-cli -r 3 ping)

-i((interval)选项代表每隔几秒执行一次命令,但是-i选项必须和-r选项一起使用,下面的操作会每隔1秒执行一次ping命令,一共执行5次:redis-cli -r 5 -i 1 ping)

-x(-x选项代表从标准输入(stdin)读取数据作为redis-cli的最后一个参数,例如下面的操作会将字符串world作为set hello的值:echo "world" | redis-cli -x set hello)

-c(-c(cluster)选项是连接Redis Cluster节点时需要使用的,-c选项可以防止moved和ask异常)

-a(如果Redis配置了密码,可以用-a(auth)选项,有了这个选项就不需要手动输入auth命令)

--scan和--pattern(--scan选项和--pattern选项用于扫描指定模式的键,相当于使用scan命令)

--slave(--slave选项是把当前客户端模拟成当前Redis节点的从节点,可以用来获取当前Redis节点的更新操作)

--rdb(--rdb选项会请求Redis实例生成并发送RDB持久化文件,保存在本地。可使用它做持久化文件的定期备份)

--pipe(--pipe选项用于将命令封装成Redis通信协议定义的数据格式,批量发送给Redis执行)

--bigkeys(--bigkeys选项使用scan命令对Redis的键进行采样,从中找到内存占用比较大的键值,这些键可能是系统的瓶颈)

--eval(--eval选项用于执行指定Lua脚本)

--latency(latency有三个选项,分别是--latency、--latency-history、--latency-dist。它们都可以检测网络延迟,对于Redis的开发和运维非常有帮助)

(1)--latency:该选项可以测试客户端到目标Redis的网络延迟

(2)--latency-history:--latency的执行结果只有一条,如果想以分时段的形式了解延迟信息

(3)--latency-dist:该选项会使用统计图表的形式从控制台输出延迟统计信息

--stat:--stat选项可以实时获取Redis的重要统计信息,虽然info命令中的统计信息更全,但是能实时看到一些增量的数据(例如requests)对于Redis的运维还是有一定帮助的

--raw和--no-raw:--no-raw选项是要求命令的返回结果必须是原始的格式(二进制),--raw恰恰相反,返回格式化后的结果。

2、redis-server(redis-server除了启动Redis外,还有一个--test-memory选项。redis-server--test-memory可以用来检测当前操作系统能否稳定地分配指定容量的内存给Redis,通过这种检测可以有效避免因为内存问题造成Redis崩溃)

redis-server --test-memory 1024:检测当前操作系统能否提供1G的内存给Redis

3、redis-benchmark(redis-benchmark可以为Redis做基准性能测试,它提供了很多选项帮助开发和运维人员测试Redis的相关性能,下面分别介绍这些选项。)

-c:-c(clients)选项代表客户端的并发数量(默认是50)

-n<requests>:-n(num)选项代表客户端请求总量(默认是100000)

-q:-q选项仅仅显示redis-benchmark的requests per second信息

--csv:--csv选项会将结果按照csv格式输出,便于后续处理,如导出到Excel等。

三、Pipeline

Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT。Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端,redis-cli的--pipe选项实际上就是使用Pipeline机制,目前大部分Redis客户端都支持Pipeline。

可以使用Pipeline模拟出批量操作的效果,但是在使用时要注意它与原生批量命令的区别,具体包含以下几点:

·原生批量命令是原子的,Pipeline是非原子的。

·原生批量命令是一个命令对应多个key,Pipeline支持多个命令。

·原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

最佳实践:Pipeline虽然好用,但是每次Pipeline组装的命令个数不能没有节制,否则一次组装Pipeline数据量过大,一方面会增加客户端的等待时间,另一方面会造成一定的网络阻塞,可以将一次包含大量命令的Pipeline拆分成多次较小的Pipeline来完成

四、事务与Lua

1、事务:Redis提供了简单的事务功能,将一组需要一起执行的命令放到multi和exec两个命令之间,如果要停止事务的执行,可以使用discard命令代替exec命令即可。(Redis并不支持回滚功能)

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name rdb
QUEUED
127.0.0.1:6379> set age 12
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379>

2、Lua脚本

在Redis中执行Lua脚本有两种方法:eval和evalsha。

参考资料:《Redis开发与运维》

Redis学习——常用小功能的更多相关文章

  1. iOS常用小功能

    CHENYILONG Blog 常用小功能 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong  ...

  2. iOS 网易彩票-6设置模块三(常用小功能)

    该篇文章中,用到很多iOS开发过程中常用的小功能,当前只是将这些功能集成到网易彩票的设置中.iOS-常用小功能介绍,请参考我的另一篇文章: iOS 常用小功能 总结:http://www.cnblog ...

  3. iOS 常用小功能 总结

    常用小功能 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话 方法一(不被采用): 拨号之前会弹框询问用户是否拨号,拨完后能自动回到原应用 NSUR ...

  4. android 常用小功能(第二版)

    经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...

  5. iOS 通信常用小功能

    打电话 a.最简单最直接的方式:直接跳到拨号界面 NSURL *url = [NSURL URLWithString:@"tel://10010"]; [[UIApplicatio ...

  6. appium 学习各种小功能总结--功能有《滑动图片、保存截图、验证元素是否存在、》---新手总结(大牛勿喷,新手互相交流)

    1.首页滑动图片点击 /** * This Method for swipe Left * 大距离滑动 width/6 除数越大向左滑动距离也越大. * width:720 *height:1280 ...

  7. JavaScript 常用小功能

    判断一个是否是隐藏状态 $(curid).is(":visible") 响应回车 $("#password").keydown(function (e) {  ...

  8. JS中部分不常用小功能记录

    1.serializeArray()在表单中使用,必须在form标签中,需要手机的元素要有name属性.源生JS将对象转成json   resulrMK = JSON.stringify(resulr ...

  9. Redis学习-常用命令

    keys * 返回满足的所有键 exists key 是否存在指定的key,存在返回1,不存在返回0 expire key time 设置指定key的过期时间,可以使用ttl key查看剩余时间 pe ...

随机推荐

  1. X-Deep Learning功能模块

    X-Deep Learning功能模块 特征体系 样本 特征 网络 数据准备 样本格式 使用DataReader读取数据 自定义python reader 定义模型 稀疏部分 稠密部分 优化器 训练模 ...

  2. TensorFlow实现超参数调整

    TensorFlow实现超参数调整 正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值 ...

  3. 通过Mellanox ConnectX NIC使用XDP加速

    通过Mellanox ConnectX NIC使用XDP加速 Accelerating with XDP over Mellanox ConnectX NICs XDP(eXpress Data Pa ...

  4. the rust book 的简单入门笔记

    rust learning day 1 (2021/05/27) 学了常量,变量,数据类型,控制流,所有权 char 的宽度是4字节,一个 unicode 的宽度 控制流条件都不要括号 rust 中的 ...

  5. 「是时候升级Java11了」 JDK11优势和JDK选择

    Java8 商用收费 从2019年1月份开始,Oracle JDK 开始对 Java SE 8 之后的版本开始进行商用收费,确切的说是 8u201/202 之后的版本.如果你用 Java 开发的功能如 ...

  6. NOIP模拟测试20「周·任·飞」

    liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数=联通块数 前缀和维护边 ...

  7. NOIP模拟测试23「mine·water·gcd」

    mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc++.h> using namespace std; //无脑dp # ...

  8. 在 raspberry pi pico 上体验 MicroPython

    raspberry pi pico 官方提供 2 种开发方式,其中一种是使用 python3 开发,树莓派提供了 MicroPython 固件,把这个固件烧录进去,就可以 在 pico 上跑 pyth ...

  9. 玩转STM32MP157- 在应用层中使用 fbtft

    fbtft使用的是framebuffer框架,这种框架将显示设备抽象为帧缓冲区,对framebuffer设备(/dev/fbx(0.1.2..))进行相关操作可以反应到LCD上. 现在尝试下在用户空间 ...

  10. lvm脚本

    # 2 SWAP 20GB SWAP # 3 /usr/sap 50GB /usr/sap # 4 Shared 1 x 512 GiB /hana/shared # 5.6 Log 2 x 300 ...