Redis学习(4)-慢查询分析与RESP协议

慢查询

Redis慢查询分析

与MySQL一样:当执行时间超过极大值时,会将发生时间、耗时、 命令记录;

redis命令生命周期:发送 排队 执行 返回,慢查询只统计第3个执行步骤的时间

Redis如何设置

  1. 动态设置6379:> config set slowlog-log-slower-than 10000 //10毫秒
    使用config set完后,若想将配置持久化保存到redis.conf,要执行config rewrite ;前提是你根据redis.conf 执行

  2. redis.conf修改:找到slowlog-log-slower-than 10000 ,修改保存即可
    注意:slowlog-log-slower-than =0记录所有命令 -1命令都不记录

Redis慢查询原理

慢查询记录也是存在队列里的,slow-max-len 存放的记录最大条数,比如设置的slow-max-len=10,当有第11条慢查询命令插入时,队列的第一条命令就会出列,第11条入列到慢查询队列中, 可以config set动态设置,也可以修改redis.conf

获取队列里慢查询的命令:slowlog get
获取慢查询列表当前的长度:slowlog len
对慢查询列表清理(重置):slowlog reset
对于线上slow-max-len配置的建议:线上可加大slow-max-len的值,记录慢查询存 长命令时redis会做截断,不会占用大量内存,线上可设置1000以上
对于线上slowlog-log-slower-than配置的建议:默认为10毫秒,根据redis并发量来调整,对于高并发比建议为1毫秒
慢查询是先进先出的队列,访问日志记录出列丢失,需定期执行slowlog get,将结果          存储到其它设备中

Redis性能测试(在外部请求)

  1. redis-benchmark -h 192.168.42.111 -p 6379 -c 100 -n 10000
    100个并发连接,10000个请求,检测服务器性能
  2. redis-benchmark -h 192.168.42.111 -p 6379 -q -d 100
    测试存取大小为100字节的数据包的性能
  3. redis-benchmark -h 192.168.42.111 -p 6379 -t set,get -n 100000 -q
    只测试 set,lpush操作的性能
  4. redis-benchmark -h 192.168.42.111 -p 6379 -n 100000 -q script load “redis.call(‘set’,‘foo’,‘bar’)”
    只测试某些数值存取的性能

RESP协议

Redis服务器与客户端通过RESP(Redis Protocol specification)协议通信 (aof 文件就是通过RESP存储的)

  • Simple to implement.
  • Fast to parse.
  • Human readable.

好实现、解析快、易于理解

set test 5 我执行了这个命令 产生的RESP 可以在aof文件里面查看
*3  -----表示后面有几组数据 set test 5  所以就是3
$3  -----set 的长度 为3
set -----执行的命令
$4  -----test的长度 为4
test ----执行的命令
$1   ----5的长度
5    ----执行的命令

应用

我们可以通过这个在客户端产生成这样的数据通过socket连接redis 发送给他(jedis客户端的原理就是这样)

我们也可以通过把数据库数据查询出来格式化成resp的格式请求redis(就做到了备份数据库)

mysql -utest -ptest stress --default-character-set=utf8 --skip-column-names --raw < order.sql | redis-cli -h 192.168.42.111 -p 6379 -a 12345678  --pipe
1. 使用用户名和密码登陆连接数据库
2. 登陆成功后执行order.sql的select语句得到查询结果集result
3. 使用密码登陆Redis
4. Redis登陆成功后, 使用PIPE管道将result导入Redis.

PIPELINE操作流程

大多数情况下,我们都会通过请求-相应机制去操作redis。只用这种模式的一般的步骤是,先获得jedis实例,然后通过jedis的get/put方法与redis交互。由于redis是单线程的,下一次请求必须等待上一次请求执行完成后才能继续执行。然而使用Pipeline模式,客户端可以一次性的发送多个命令,无需等待服务端返回。这样就大大的减少了网络往返时间,提高了系统性能。但是要用好、用对还是得深度学习

流程

使用PIPELINE可以解决网络开销的问题

原理也非常简单,流程如下, 将多个指令打包后,一次性提交到Redis, 网络通信只有一次

2112622647)]

原理也非常简单,流程如下, 将多个指令打包后,一次性提交到Redis, 网络通信只有一次

[外链图片转存中…(img-PbgNXhLh-1582112622648)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章