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

相关推荐
jay神7 小时前
基于SpringBoot的宠物生命周期信息管理系统
java·数据库·spring boot·后端·web开发·宠物·管理系统
PeterLi7 小时前
Redis 分布式锁架构全解析:从基础实现到生产级选型指南
redis·分布式
秋98 小时前
MySQL 8.0.46 与 MySQL 9.7.0在sql语句方面的区别并举例说明
数据库·sql·mysql
一只数据集8 小时前
NVIDIA Nemotron AIQ Agentic Safety Dataset:面向企业级智能体系统的安全与防护评估数据集全面解析
网络·数据库·安全
Amazinqc8 小时前
Mysql数据库数据软隔离的并发死锁情况
数据库·mysql·死锁
DianSan_ERP8 小时前
京东订单接口集成中如何处理消费者敏感信息的安全与合规问题?
前端·数据库·后端·团队开发·运维开发
原来是猿8 小时前
TCP Echo Server 深度解析:从单进程到线程池的演进之路(中)
linux·服务器·数据库
treesforest8 小时前
IP地址段查询完全指南:从单IP查到IPv4段批量归属地查询
网络·数据库·网络协议·tcp/ip·网络安全·运维开发
下次再写8 小时前
【Redis实战】深入理解Redis缓存策略:从原理到Spring Boot实践
java·spring boot·redis·缓存穿透·缓存击穿·分布式缓存·缓存策略
渣渣灰95879 小时前
基于STM32F03ZET6移植FreeRTOS
数据库·stm32·嵌入式硬件