Redis变慢了?
什么是Redis?
作为一个技术人员来说,大家用的最多的可能就是Redis了,那么什么是Redis呢?这里简单描述一下。 Redis是key-value 存储系统,是跨平台的非关系型数据库。支持丰富的数据结构,包括:字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。那么如何来测定认为Redis变慢了呢?
测定Redis变慢?
如何来测定Redis变慢了呢?最直观的方法就是检测到使用Redis的业务响应变慢了,甚至响应超时了,那么当然也有可以人工来观测Redis是否变慢的办法,在测试Redis是否变慢之前首先要有一个变慢的基准,也就是说定一个红线,当响应时长超过红线了,那么就认为Redis变慢了,可以开始排查变慢原因以及相关Redis的优化了。那么这个基准怎么来呢?不同的Redis服务器基准定然是不一样的,下面我们来测一下。
最大响应延迟
先来测一下Redis最大响应延迟,在Redis服务器上执行命令,测试60秒内最大响应时长
shell
[root@middle.6.118 ~]#redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60
返回结果
可以看到60秒内最大响应延迟就是1742微秒(1.742毫秒)
平均响应延迟
下面我们再来看一下Redis的最小、最大、平均延迟,每隔1秒采样一次
shell
[root@middle.6.118 ~]#redis-cli -h 127.0.0.1 -p 6379 --latency-history -i 1
返回结果
可以看到在这段时间内平均延迟最大0.42毫秒。
那么后续当你发现某一天你的Redis响应平均延迟超过这个数值的话你就可以认为Redis变慢了。
设置Redis慢日志
这里你可以通过登录Redis服务器来设置Redis的慢日志,方便后续根据慢日志查找问题
shell
# 登录Redis
[root@middle.6.118 ~]#redis-cli -h 127.0.0.1 -p 6379
# 慢日志记录超过5毫秒的执行记录
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 5000
# 保留最近50条慢日志 这个根据业务需要
127.0.0.1:6379> CONFIG SET slowlog-max-len 50
查看慢日志列表
shell
# 10 表示指定条数 不指定则查询全部
127.0.0.1:6379> SLOWLOG get 10
其中:
1)慢日志id
2)执行时间戳
3)执行耗时
4)执行命令、参数
查看指定id慢日志详情
shell
127.0.0.1:6379> SLOWLOG get 18338215
清空慢日志
shell
127.0.0.1:6379> SLOWLOG RESET
分析Redis变慢
Redis变慢会有多方面的原因
bigkeys
比如说你存写的value太大,会导致Redis在读取这个key对应的大value时响应变慢导致后续响应都会拖慢,排查bigkeys命令
shell
[root@middle.6.118 ~]#redis-cli -h 127.0.0.1 -p 6379 --bigkeys -i 0.01
其中 -i 0.01的单位是秒 You can use -i 0.1 to sleep 0.1 sec
其中我们可以看到每种数据类型所占用的最大内存 / 拥有最多元素的 key 是哪一个,以及每种数据类型在整个实例中的占比和平均大小 / 元素数量。
bigkey的危害
1.响应变慢、超时阻塞 Redis是单线程运行,同一时段只能处理一个请求,处理bigkeys时会比较耗时,请求响应变慢,同时也会阻塞其他请求处理。
2.网络阻塞 比如说一个bigkeys是1MB,那么同时处理1000个的话就是1000MB流量,造成网络阻塞。
3.内存分布不均 Redis集群场景下,当当部分bigkeys分布在同一个节点时导致内存倾斜在这一个节点,内存分布不均。
bigkey优化
1.业务应用尽量避免写入 bigkey。
2.删除bigkey,用 UNLINK 命令替代 DEL,此命令可以把释放 key 内存的操作,放到后台线程中去执行,从而降低对 Redis 的影响。
写在最后
后续会继续分析其他场景下Redis变慢的情况,敬请关注。