Redis慢查询日志

Redis慢查询日志

前提

一个线程将一个txt中140M的数据插入到redis的hashset中,同时我开另一个线程1秒钟一次的从string中获取数据,同时记录下获取时间,如果获取string的时间间隔太大,说明阻塞产生了。



 

读取string的线程被Hashset阻塞了6s之多,很恐怖,这个就属于典型的慢查询,它的慢果然阻塞了其他client

原因

redis是单线程的,如果是这么大数据量的插入,会阻塞其他命令的执行。所以在加入这种特殊业务的时候应该要注意。

同时,太大数据两的Hset有可能会导致超时的情况,这回比较致命。

解决方案

1. 将140M的数据拆分成14个10M的数据,好处有两个,第一减少Hset的时间,第二是尽量不阻塞其他线程操作数据,不过要改代码。

2. redis做主从,将读写分离开,这样读写的压力都比较均衡,但是大量的Hset还是会阻塞写数据库的其他命令。

3. 同时使用这两种方法

4. 专门开一个redis来存储缓存,将这块缓存数据分离开来,慢就慢,自己管理自己的数据,为了保证主redis不出问题。

慢查询日志

为了找到哪些查询被阻塞了,可以启动慢查询日志

定义

1. Slow log 是 Redis 用来记录查询执行时间的日志系统。

2. 查询执行时间指的是不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。

3. 另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。

设置slowlog

可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改。

slowlog-log-slower-than:对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的查询进行记录

slowlog-max-len:它决定 slow log 最多能保存多少条日志, slow log 本身是一个 FIFO 队列,当队列大小超过 slowlog-max-len 时,最旧的一条日志将被删除,而最新的一条日志加入到 slow log ,以此类推。

# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
slowlog-log-slower-than 0

# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 10

运行效果



 

猜你喜欢

转载自youyu4.iteye.com/blog/2343130