9_Redis慢查询日志

本文介绍了Redis的慢查询日志分析,包括慢查询的阈值设置、原理及命令,强调了线上环境中配置建议,并探讨了Pipeline与Lua脚本在减少网络开销和提升性能上的作用。

一、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脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值