1. 什么是 Redis 慢查询?
当执行时间超过极大值时,会将发生时间 耗时 命令记录
redis命令生命周期:发送 排队 执行 返回
慢查询只统计第3个执行步骤的时间
Redis 的所有指令全部会存放到队列, 由单线程按顺序获取并执行指令, 如果某个指令执
行很慢, 会出现阻塞
2. 设置
- 动态设置 6379:> config set slowlog-log-slower-than 10000 //10 毫秒
使用 config set 完后,若想将配置持久化保存到 redis.conf,要执行 config rewrite - redis.conf 修改:找到 slowlog-log-slower-than 10000 ,修改保存即可
注意:slowlog-log-slower-than =0 记录所有命令 -1 命令都不记录
3. 慢查询原理
慢查询记录也是存在队列里的,slow-max-len 存放的记录最大条数,比如设置的 slow-max-len=10,当有第 11 条慢查询命令插入时,队列的第一条命令就会出列,第 11 条入列到慢查询队列中, 可以 config set 动态设置,也可以修改 redis.conf 完成配置
4. 慢查询的命令
获取队列里慢查询的命令:slowlog get
获取慢查询列表当前的长度:slowlog len //以上只有 1 条慢查询,返回 1;
- 对慢查询列表清理(重置):slowlog reset //再查 slowlog len 此时返回 0 清空;
- 对于线上 slow-max-len 配置的建议:线上可加大 slow-max-len 的值,记录慢查询存
长命令时 redis 会做截断,不会占用大量内存,线上可设置 1000 以上 - 对于线上 slowlog-log-slower-than 配置的建议:默认为 10 毫秒,根据 redis 并发量
来调整,对于高并发比建议为 1 毫秒 - 慢查询是先进先出的队列,访问日志记录出列丢失,需定期执行 slowlog get,将结果
存储到其它设备中(如 mysql)
5. Redis 性能测试工具如何使用?
A、redis-benchmark -h 192.168.42.111 -p 6379 -c 100 -n 10000
//100 个并发连接,10000 个请求,检测服务器性能
B、redis-benchmark -h 192.168.42.111 -p 6379 -q -d 100
//测试存取大小为100 字节的数据包的性能
C、redis-benchmark -h 192.168.42.111 -p 6379 -t set,get -n 100000 -q
//只测试set,lpush 操作的性能
D 、redis-benchmark -h 192.168.42.111 -p 6379 -n 100000 -q script load “redis.call(‘set’,‘foo’,‘bar’)”
//只测试某些数值存取的性能
6. 什么是Resp 协议?
Redis 服务器与客户端通过RESP(REdis Serialization Protocol)协议通信。
主要以下特点:容易实现,解析快,人类可读.
RESP 底层采用的是TCP 的连接方式,通过tcp 进行数据传输,然后根据解析规则解析相
应信息,完成交互。
服务端程序如下:
客户端程序如下:
测试发现, 服务端打印的信息如下:
7. 将你现有表数据快速存放到Redis
流程如下:
A) , 使用用户名和密码登陆连接数据库
B) , 登陆成功后执行order.sql 的select 语句得到查询结果集result
C) , 使用密码登陆Redis
D), Redis 登陆成功后, 使用PIPE 管道将result 导入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
8. PIPELINE 操作流程
使用Pipeline 模式,客户端可以一次性的发送多个命令,无需等待服务端返回。这样就大大的减少了网络往返时间,提高了系统性能。
将多个指令打包后,一次性提交到Redis, 网络通信只有一次
9. Redis 弱事务
pipeline 是多条命令的组合,为了保证它的原子性,redis 提供了简单的事务
- redis 的简单事务,将一组需要一起执行的命令放到multi 和exec 两个命令之间,其中multi 代表事务开始,exec 代表事务结束.
注:在multi 前set user:age 4 //请提前初始化该值
- 停止事务discard
- 命令错误,语法不正确,导致事务不能正常结束
- 运行错误,语法正确,但类型错误,事务可以正常结束
可以看到redis 不支持回滚功能 - Watch 让事务失效,操作命令
10. redis 主要提供发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅
- 发布消息
publish channel:test “hello world”
- 订阅消息
subscrible channel:test
此时另一个客户端发布一个消息:publish channel:test “james test”
当前订阅者客户端会收到如下消息:
和很多专业的消息队列(kafka rabbitmq),redis 的发布订阅显得很lower, 比如无法实现消息规程和回溯, 但就是简单,如果能满足应用场景,用这个也可以 - 查看订阅数:
pubsub numsub channel:test // 频道channel:test 的订阅数 - 取消订阅
unsubscribe channel:test
客户端可以通过unsubscribe 命令取消对指定频道的订阅,取消后,不会再收到该频道的消息 - 按模式订阅和取消订阅
psubscribe ch* //订阅以ch 开头的所有频道
punsubscribe ch* //取消以ch 开头的所有频道
- 应用场景
1、今日头条订阅号、微信订阅公众号、新浪微博关注、邮件订阅系统
2、即使通信系统
3、群聊部落系统(微信群)