Redis突然变慢,有哪些原因?

目录

一、存在bigkey

[二、如果Redis 实例设置了内存上限 maxmemory,有可能导致 Redis 变慢](#二、如果Redis 实例设置了内存上限 maxmemory,有可能导致 Redis 变慢)

三、开启了内存大页

四、使用了Swap

五、网络带宽过载

六、频繁短连接


一、存在bigkey

如果Redis实例中存储了 bigkey,那么在淘汰删除 bigkey 释放内存时,也会耗时比较久。应该避免存储 bigkey,降低释放内存的耗时。

二、如果Redis 实例设置了内存上限 maxmemory,有可能导致 Redis 变慢

当 Redis 内存达到 maxmemory 后,每次写入新的数据之前,Redis 必须先从实例中踢出一部分数据,让整个实例的内存维持在 maxmemory 之下,然后才能把新数据写进来。

三、开启了内存大页

当 Redis 在执行后台 RDB 和 AOF rewrite 时,采用 fork 子进程的方式来处理。但主进程 fork 子进程后,此时的主进程依旧是可以接收写请求的,而进来的写请求,会采用 Copy On Write(写时复制)的方式操作内存数据。

什么是写时复制?

这样做的好处是,父进程有任何写操作,并不会影响子进程的数据持久化。

不过,主进程在拷贝内存数据时,会涉及到新内存的申请,如果此时操作系统开启了内存大页,那么在此期间,客户端即便只修改 10B 的数据,Redis 在申请内存时也会以 2MB 为单位向操作系统申请,申请内存的耗时变长,进而导致每个写请求的延迟增加,影响到 Redis 性能。

解决方案就是关闭内存大页机制。

四、使用了Swap

操作系统为了缓解内存不足对应用程序的影响,允许把一部分内存中的数据换到磁盘上,以达到应用程序对内存使用的缓冲,这些内存数据被换到磁盘上的区域,就是 Swap。当内存中的数据被换到磁盘上后,Redis 再访问这些数据时,就需要从磁盘上读取,访问磁盘的速度要比访问内存慢几百倍。尤其是针对 Redis 这种对性能要求极高、性能极其敏感的数据库来说,这个操作延时是无法接受的。

解决方案:增加机器的内存,让 Redis 有足够的内存可以使用。或者整理内存空间,释放出足够的内存供 Redis 使用

五、网络带宽过载

网络带宽过载的情况下,服务器在 TCP 层和网络层就会出现数据包发送延迟、丢包等情况。Redis 的高性能,除了操作内存之外,就在于网络 IO 了,如果网络 IO 存在瓶颈,那么也会严重影响 Redis 的性能。

解决方案:

1、及时确认占满网络带宽 Redis 实例,如果属于正常的业务访问,那就需要及时扩容或迁移实例了,避免因为这个实例流量过大,影响这个机器的其他实例。

2、运维层面,需要对 Redis 机器的各项指标增加监控,包括网络流量,在网络流量达到一定阈值时提前报警,及时确认和扩容。

六、频繁短连接

频繁的短连接会导致 Redis 大量时间耗费在连接的建立和释放上,TCP 的三次握手和四次挥手同样也会增加访问延迟。

解决方案:应用应该使用长连接操作 Redis,避免频繁的短连接。

相关推荐
P7进阶路3 小时前
nginx 代理 redis
运维·redis·nginx
八股文领域大手子5 小时前
责任链模式+策略模式在项目中的实践
java·数据库·redis·sql·mysql
m0_748248238 小时前
centOS 环境 安装redis方法
linux·redis·centos
格子先生Lab11 小时前
Spring Boot 本地缓存工具类设计与实现
spring boot·后端·缓存
rockmelodies14 小时前
CentOS 最新系统安装 Redis 7.0.11 详细指南
linux·redis·centos
努力学计算机的小白一枚17 小时前
146.LRU缓存
java·数据结构·缓存
雾喔17 小时前
Java的缓存
java·缓存·mybatis
SchneeDuan17 小时前
力扣146 - LRU缓存
缓存·lru
JLiuli17 小时前
Redis网络模型
数据库·redis·缓存
等什么君!18 小时前
Mybatis缓存机制(一级缓存和二级缓存)
java·缓存·mybatis