与mysql的慢查询类似,当执行时间超过极大值时,会将命令、耗时、发生时间等信息记录在队列中。需要注意的是,我们在使用redis时,通信的流程主要分为了:发送命令—>进入队列—>执行命令—>返回结果。当redis接收到大量的请求时,会先将请求全部放入队列中,然后通过单线程按顺序获取并执行,由于是单线程执行命令,所以某个命令耗时过长会出现阻塞的现象,而redis里指的慢查询,只针对于执行命令这一步。
redis需要通过命令或修改配置来慢查询的时间阈值,值得注意的是,如果配置为-1则表示所有命令都不保存,如果配置为0则表示记录所有命令
方法一:修改配置redis.conf文件
方法二:通过config set slowlog-log-slower-than 5000命令修改为5毫秒
此时如果服务器不重启,则会将执行时间超过5毫秒的命令加入慢查询队列,如果重启了redis则会失效,可以来看看redis.conf配置文件
如果想要配置在下次重启时也保持为5毫秒,则需要在config set slowlog-log-slower-than 5000后,再执行config rewrite命令
除了配置时间阈值外,因为命令会进入队列中,所以还可以配置慢查询的队列长度,方法跟上面一样有两个,配置项为slow-max-len,除了slowlog-log-slower-than改为slow-max-len,其他都是一样的。当队列达到最大记录长度时,继续插入会将队列中第一条命令弹出,而将新的命令插入到队尾。例如最大长度slow-max-len设置为20,当第21条慢查询命令进入队列时,队头的第一条慢查询命令会出列,然后新的慢查询命令会进入到队尾。
常用的慢查询命令和处理方案:
- 获取慢查询队列中的慢查询命令:slowlog get
- 获取慢查询队列当前的长度:slowlog len
- 清理(重置)慢查询队列:slowlog reset
- 有些redis的命令比较长,那么会有的人认为如果队列最大长度过长可能会导致占用的内存过高,然而并不会,因为redis在记录慢查询命令时会将过长的命令做截断处理,所以如果有需要可以将长度存的大一些。(根据实际情况定长度)
- 对于并发量比较高要求的需求,可将redis的slowlog-log-slower-than设置的相对小些(默认10毫秒)
- 因为redis在队列满后的处理机制是将队头的命令出队处理,会导致可能出现记录丢失的可能,所以需要定时的通过命令slowlog get获取到队列的命令,然后做持久化处理(如存入数据库中),方便后续的问题跟进。
性能测试工具
redis号称每秒能够处理十万请求,那我们是否能够测试下在我们的机器上redis性能如何呢?redis自带了redis-benchmark的性能测试工具,我们可以通过这个工具来做一些简单的测试:
- ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 10000 -q 其中-c表示并行数,-n表示请求数量 -q表示只显示每秒钟的请求数结果
- 在某些时候,我们存取的数据包大小趋近于某个范围,我们可以专门测试针对某个数值大小的数据包存取的性能
./redis-benchmark -h 127.0.0.1 -p 6379 -q -d 80 其中 -d表示存取的数据包大小
- 前面两种方式都是对所有指令进行测试的,如果只想对某些指令则需要用下面这个参数
./redis-benchmark -h 127.0.0.1 -p 6379 -q -t set,get 其中-t 指定测试的命令
- 还可以专门对某个完整的指令进行测试
./redis-benchmark -h 127.0.0.1 -p 6379 -q script load “redis.call(‘set’,‘name’,‘tom’)”
redis 提供了简单的事务,什么是事务?事务是指一组动作的执行,这一组动作要么成功,要么失败。
主要涉及到的命令:
- MUTIL:开启事务,此后所有的操作将会添加到当前链接的事务“操作队列”中。
- EXEC:提交事务
- DISCARD:取消事务,该指令表示“事务操作被取消”的语义,将会导致事务的操作队列中的操作不会被执行,且事务关闭。
- WATCH/UNWATCH:“观察”,这个操作也可以说是Redis的特殊功能,也可说是Redis不能提供“绝对意义上”的事务能力而增加的一个“补充特性”。在事务开启前,可以对某个KEY注册“WATCH”,如果在事务提交后,将会首先检测“WATCH”列表中的KEY集合是否被其他客户端修改,如果任意一个KEY 被修改,都将会导致事务直接被“DISCARD”,即使事务中没有操作某个WATCH KEY,如果此KEY被外部修改,仍然会导致事务取消。事务执行成功或者被DISCARD,都将会导致WATCH KEY被“UNWATCH”,因此事务之后,你需要重新WATCH。WATCH需要在事务开启之前执行。
第一种:正常提交事务
第二种:取消事务
第三种:命令错误,语法不正确,导致事务不能正常结束
第四种:命令语法正确,事务提交后运行错误,出错的命令执行失败,其他命令正常,事务可以正常结束
第五种:watch的使用
发布订阅redis 主要提供发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅,redis的发布订阅十分的简单,如果需要使用到这面的技术,除非真的需求十分简单,不然还是推荐使用MQ消息队列来完成,这里主要演示下简单的发布订阅,因为笔者个人也不会在复杂的场景中使用redis的发布订阅技术。



