一、redis 慢查询分析
与mysql一样执行时间超过阈值,会发生时间耗时命令记录
redis 声明周期:发送--> 排队 --> 执行 -->返回
redis 不关注排队的时间 ,只关注执行的时间
二、慢查询阈值
1 动态设置
config set slowlog-log-slower-than 10000 //10毫秒 线上一般设置为10毫秒
使用config set 完后,若想将配置持久化保存到redis.conf,要执行config rewrite
2 永久生效
redis.conf修改:找到slowlog-log-slower-than 10000 修改保存即可
注意:slowlog-log-slower-than =0 记录所有命令 -1命令都不记录
三、慢查询原理
慢查询记录也是存在队列里,slow-max-len存放的记录最大条数,比如
设置的slow-max-len=10,当有第11条慢查询命令插入时,队列的第一条命令
就会出列,第11条入列到慢查询队列中,可以config set 动态设置 也可以
修改redis.conf完成配置
四、慢查询命令
获取队列慢查询的命令 slowlog get
获取慢查询列表当前的长度:slow len //以上只有1条慢查询,返回1
1.对慢查询列表清理(重置):slowlog reset //再查slowlog len 此时返回0清空;
2.对于线上slow-max-len配置的建议:线上可加大slow-max-len的值,记录慢查询存
长命令时redis会做截断,不会占用大量内存,线上可设置1000以上
3.对于线上slow-log-slower-than 配置的建议:默认10毫秒,根据reids并发量来调整,
对比并发比建议为1毫秒
4.慢查询是先进先出的队列,访问日志记录出列丢失,需定期执行slow get,将结果
存储到其他设备中(如mysql)
注意: 如果slowlog get 无数据,请将数据库表导入redis
1 登录mysql:指定数据库
2 执行SQL语句 select * from order
3 登录reids ./redis-cli -h 192.168.42.111 -p 6379 -a 12345678
4 把result使用PIPE管道导入到redis
mysql -unset -ptest stress --default-character-set=utf8 --skip-column-names --raw < order.sql |
redis-cli -h 192.168.42.111 -p 6379 -a 12345678 --pipe
redis-benchmark详解 redis-benchmark -h
redis-benchmark -c 100 -n 1000
五、测试命令事例
1.redis-benchmark -h 192.168.42.111 -p 6379 -c 100 -n 100000
100个并发连接 100000请求,检测host为localhost端口为6379的redis 服务器性能
2.redis-benchmark -h 192.168.42.111 -p 6379 -q -d 100
测试存取大小100字节的数据包的性能
3.redis-benchmark -t set ,lpush -n 100000 -q
4.redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
只测试某些数值存取的性能
Pipeline 详解
redis 客户端执行一条命令分4个过程
发送命令--> 命令排队 --> 命令执行--> 返回结果
这个过程称为Round trip time (简称RTT,往返时间),mget mset有效节约了RTT,但大部分命令
(如hgetall,并没有mhgetall)不支持批量,需要消耗N次RTT,这个时候需要pipeline来解决这个
问题
批量减少网络开销
//第一种批量
Jedis jedis = new Jedis();
Pipeline pipe = jedis.pipelined();
for(){
pipe.del() //这一步是组装
}
pipe提交
//第二种批量
pipe.hset();
pipe.hget();
.....
pipe 提交
原生批命令(mset,mget)与Pipeline对比
one 原生命令是原子性,pipeline是非原子性
two 原生批命令一个命令多个key,但pipeline 支持多命令(存在事务),非原子性
three 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成
pipeline 正确使用方式
使用pipeline 组装的命令个数不能太多,不然数量过大增加客户端的等待时间,
还可能造成网络阻塞,
可以将大量命令拆分多个小的pipeline命令完成
Lua 语言与Redis
LUA脚本语言是c开发的,类似存储过程
使用脚本好处
1.减少网络开销
2.原子操作
3.复用性
redis 对Lua脚本的管理
1.将Lua脚本加载到redis中
2.检查脚本加载是否成功
3.清空Lua脚本内容
4.杀掉正在执行的Lua脚本
本文介绍了Redis的慢查询日志分析,包括慢查询的阈值设置、原理及命令,强调了线上环境中配置建议,并探讨了Pipeline与Lua脚本在减少网络开销和提升性能上的作用。

被折叠的 条评论
为什么被折叠?



