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,避免频繁的短连接。

相关推荐
Mephisto.java1 小时前
【大数据学习 | Spark-Core】Spark中的join原理
大数据·redis·sql·oracle·spark·json·database
G丶AEOM2 小时前
Redis与MySQL如何保证数据一致性
java·redis
生活百般滋味,人生需要笑对。 --佚名3 小时前
docker如何安装redis
redis·docker·容器
G丶AEOM4 小时前
Redis中HGETALL和ZRANGE命令
java·redis
安安啦7 小时前
Redis复习
redis
得物技术7 小时前
基于Redis内核的热key统计实现方案|得物技术
redis
Allen Bright8 小时前
Redis主从架构
数据库·redis·架构
fcopy8 小时前
Golang项目:实现生产者消费者模式
缓存·golang
2301_793086878 小时前
springboot+redis+lua实现分布式锁
spring boot·redis·lua