Redis变慢了?

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变慢的情况,敬请关注。

相关推荐
TiDB_PingCAP2 小时前
国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线
运维·数据库·开源·tidb
乐安lan3 小时前
数据库的操作
数据库·oracle
霖烟易辞4 小时前
MySQL中的DDL语句
数据库·mysql·ddl
PY1784 小时前
Python的上下文管理器
数据库·python·oracle
阿猿收手吧!4 小时前
【MySQL】表的操作{创建/查看/修改/删除}
数据库·mysql
超维Ai编程4 小时前
mysql从入门到精通
数据库·mysql
CCI3445 小时前
Rust简明教程第三章-所有权与借用
开发语言·数据库·rust
zengson_g5 小时前
如何监控和分析 PostgreSQL 中的查询执行计划?
数据库·postgresql·oracle
Lingoesforstudy5 小时前
InfluxDB v2.x中的Flux基本概念
数据库·influxdb
心死翼未伤5 小时前
【MySQL基础篇】多表查询
android·数据结构·数据库·mysql·算法