Redis学习——常用小功能
一、慢查询分析(查询日志:所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,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学习——常用小功能的更多相关文章
- iOS常用小功能
CHENYILONG Blog 常用小功能 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong ...
- iOS 网易彩票-6设置模块三(常用小功能)
该篇文章中,用到很多iOS开发过程中常用的小功能,当前只是将这些功能集成到网易彩票的设置中.iOS-常用小功能介绍,请参考我的另一篇文章: iOS 常用小功能 总结:http://www.cnblog ...
- iOS 常用小功能 总结
常用小功能 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话 方法一(不被采用): 拨号之前会弹框询问用户是否拨号,拨完后能自动回到原应用 NSUR ...
- android 常用小功能(第二版)
经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...
- iOS 通信常用小功能
打电话 a.最简单最直接的方式:直接跳到拨号界面 NSURL *url = [NSURL URLWithString:@"tel://10010"]; [[UIApplicatio ...
- appium 学习各种小功能总结--功能有《滑动图片、保存截图、验证元素是否存在、》---新手总结(大牛勿喷,新手互相交流)
1.首页滑动图片点击 /** * This Method for swipe Left * 大距离滑动 width/6 除数越大向左滑动距离也越大. * width:720 *height:1280 ...
- JavaScript 常用小功能
判断一个是否是隐藏状态 $(curid).is(":visible") 响应回车 $("#password").keydown(function (e) { ...
- JS中部分不常用小功能记录
1.serializeArray()在表单中使用,必须在form标签中,需要手机的元素要有name属性.源生JS将对象转成json resulrMK = JSON.stringify(resulr ...
- Redis学习-常用命令
keys * 返回满足的所有键 exists key 是否存在指定的key,存在返回1,不存在返回0 expire key time 设置指定key的过期时间,可以使用ttl key查看剩余时间 pe ...
随机推荐
- nvGRAPH API参考分析(二)
nvGRAPH API参考分析(二) nvGRAPH Code Examples 本文提供了简单的示例. 1. nvGRAPH convert topology example void check( ...
- CUDA C 纹理提取Texture Fetching
CUDA C 纹理提取Texture Fetching 一.参数曲面的纹理 使用纹理指定参数曲面属性. 二.CUDA C 纹理获取开发 用于计算纹理函数,根据纹理引用的各种属性返回的值的公式(请参见 ...
- h265player开发
h265player开发 https://github.com/goldvideo/h265player 简介 随着视频编码技术的发展,相比H.264, H.265同等画质体积仅为一半.带宽占用省一半 ...
- .NET平台系列18 .NET5的超强优势
系列目录 [已更新最新开发文章,点击查看详细] 支持所有 .NET 应用程序类型 .NET5 统一版本之后将支持所有 .NET 应用程序类型:Xamarin.ASP.NET.IoT 和桌面.此 ...
- mybatis学习——映射器(mappers)
在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...
- 端午总结Vue3中computed和watch的使用
1使用计算属性 computed 实现按钮是否禁用 我们在有些业务场景的时候,需要将按钮禁用. 这个时候,我们需要使用(disabled)属性来实现. disabled的值是true表示禁用.fals ...
- 深入解读Redis分布式锁
之前码甲哥写了两篇有关线程安全的文章: 你管这叫线程安全? .NET八股文:线程同步技术解读 分布式锁是"线程同步"的延续 最近首度应用"分布式锁",现在想想, ...
- Eclipse安装Pydev插件时所遇到的问题
安装pydev插件折腾了半天,因为总是安装不成功,不成功的表现就是:windows-preferences设置里没有pydev 由于第一次安装这个插件所以不了解安装pydev插件的版本是有要求的,根据 ...
- Air722UG_模块硬件设计手册_V1.1
下载PDF版本: Air722UG_模块硬件设计手册_V1.1.pdf @ 目录 1. 绪论 2.综述 2.1 型号信息 2.2 主要性能 2.3 功能框图 3.应用接口 3.1 管脚描述 3.2 工 ...
- JavaScript中基本数据类型和引用数据类型的区别(栈——堆)
JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...