你的Redis为什么变慢了?

redis怎么分析性能瓶颈——redis性能瓶颈定位的6个步骤 ​ 要分析 redis的性能瓶颈,首先应监控关键指标,包括 cpu 使用率、内存使用率、网络 i/o、命中率和慢查询日志。1. 监控关键指标是性能分析的第一步,通过 redis-cli info 或第三方工具如 prometheus + grafana 获取数据。2. 使用 redis-cli --latency 检测 redis 延迟,帮助识别服务器响应时间异常。3. 分析慢查询日志可揪出执行效率低的命令,通过 config set 开启日志并用 slowlog get 查看记录。 阅读详情
小Hub领读:

以前,我就干过Redis撑爆内存的事,嘿嘿~


作者:Kaito's Blog

本文来源:http://kaito-kidd.com/2020/07/03/redis-latency-analysis/

Redis 作为内存数据库,拥有非常高的性能,单个实例的 QPS 能够达到 10W 左右。但我们在使用 Redis 时,经常时不时会出现访问延迟很大的情况,如果你不知道 Redis 的内部实现原理,在排查问题时就会一头雾水。

很多时候,Redis 出现访问延迟变大,都与我们的使用不当或运维不合理导致的。

这篇文章我们就来分析一下 Redis 在使用过程中,经常会遇到的延迟问题以及如何定位和分析。

使用复杂度高的命令

如果在使用 Redis 时,发现访问延迟突然增大,如何进行排查?

首先,第一步,建议你去查看一下 Redis 的慢日志。Redis 提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大。

首先设置 Redis 的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微妙,例如设置慢日志的阈值为 5 毫秒,同时设置只保留最近 1000 条慢日志记录:

# 命令执行超过5毫秒记录慢日志
CONFIG SET slowlog-log-slower-than 5000
# 只保留最近1000条慢日志
CONFIG SET slowlog-max-len 1000

设置完成之后,所有执行的命令如果延迟大于 5 毫秒,都会被 Redis 记录下来,我们执行SLOWLOG get 5查询最近 5 条慢日志:

127.0.0.1:6379> SLOWLOG get 5
1) 1) (integer) 32693       # 慢日志ID
   2) (integer) 1593763337  # 执行时间
   3) (integer) 5299        # 执行耗时(微妙)
   4) 1) "LRANGE"           # 具体执行的命令和参数
      2) "user\_list\_2000"
      3) "0"
      4) "-1"
2) 1) (integer) 32692
   2) (integer) 1593763337
   3) (integer) 5044
   4) 1) "GET"
      2) "book\_price\_1000"
...

通过查看慢日志记录,我们就可以知道在什么时间执行哪些命令比较耗时,如果你的业务经常使用O(n)以上复杂度的命令,例如sortsunionzunionstore,或者在执行O(n)命令时操作的数据量比较大,这些情况下 Redis 处理数据时就会很耗时。

如果你的服务请求量并不大,但 Redis 实例的 CPU 使用率很高,很有可能是使用了复杂度高的命令导致的。

解决方案就是,不使用这些复杂度较高的命令,并且一次不要获取太多的数据,每次尽量操作少量的数据,让 Redis 可以及时处理返回。

存储大 key

如果查询慢日志发现,并不是复杂度较高的命令导致的,例如都是SETDELETE操作出现在慢日志记录中,那么你就要怀疑是否存在 Redis 写入了大 key 的情况。

Redis 在写入数据时,需要为新的数据分配内存,当从 Redis 中删除数据时,它会释放对应的内存空间。

如果一个 key 写入的数据非常大,Redis 在分配内存时也会比较耗时。同样的,当删除这个 key 的数据时,释放内存也会耗时比较久

你需要检查你的业务代码,是否存在写入大 key 的情况,需要评估写入数据量的大小,业务层应该避免一个 key 存入过大的数据量。

那么有没有什么办法可以扫描现在 Redis 中是否存在大 key 的数据吗?

Redis 也提供了扫描大 key 的方法:

redis-cli -h $host -p $port --bigkeys -i 0.01

使用上面的命令就可以扫描出整个实例 key 大小的分布情况,它是以类型维度来展示的。

需要注意的是当我们在线上实例进行大 key 扫描时,Redis 的 QPS 会突增,为了降低扫描过程中对 Redis 的影响,我们需要控制扫描的频率,使用-i参数控制即可,它表示扫描过程中每次扫描的时间间隔,单位是秒。

使用这个命令的原理,其实就是 Redis 在内部执行scan命令,遍历所有 key,然后针对不同类型的 key 执行strlenllenhlenscardzcard来获取字符串的长度以及容器类型 (list/dict/set/zset) 的元素个数。

而对于容器类型的 key,只能扫描出元素最多的 key,但元素最多的 key 不一定占用内存最多,这一点需要我们注意下。不过使用这个命令一般我们是可以对整个实例中 key 的分布情况有比较清晰的了解。

针对大 key 的问题,Redis 官方在 4.0 版本推出了lazy-free的机制,用于异步释放大 key 的内存,降低对 Redis 性能的影响。即使这样,我们也不建议使用大 key,大 key 在集群的迁移过程中,也会影响到迁移的性能,这个后面在介绍集群相关的文章时,会再详细介绍到。

集中过期

有时你会发现,平时在使用 Redis 时没有延时比较大的情况,但在某个时间点突然出现一波延时,而且报慢的时间点很有规律,例如某个整点,或者间隔多久就会发生一次

如果出现这种情况,就需要考虑是否存在大量 key 集中过期的情况。

如果有大量的 key 在某个固定时间点集中过期,在这个时间点访问 Redis 时,就有可能导致延迟增加。

Redis 的过期策略采用主动过期 + 懒惰过期两种策略:

  • 主动过期:Redis 内部维护一个定时任务,默认每隔 100 毫秒会从过期字典中随机取出 20 个 key,删除过期的 key,如果过期 key 的比例超过了 25%,则继续获取 20 个 key,删除过期的 key,循环往复,直到过期 key 的比例下降到 25% 或者这次任务的执行耗时超过了 25 毫秒,才会退出循环

  • 懒惰过期:只有当访问某个 key 时,才判断这个 key 是否已过期,如果已经过期,则从实例中删除

注意,Redis 的主动过期的定时任务,也是在 Redis 主线程中执行的,也就是说如果在执行主动过期的过程中,出现了需要大量删除过期 key 的情况,那么在业务访问时,必须等这个过期任务执行结束,才可以处理业务请求。此时就会出现,业务访问延时增大的问题,最大延迟为 25 毫秒。

而且这个访问延迟的情况,不会记录在慢日志里。慢日志中只记录真正执行某个命令的耗时,Redis 主动过期策略执行在操作命令之前,如果操作命令耗时达不到慢日志阈值,它是不会计算在慢日志统计中的,但我们的业务却感到了延迟增大。

此时你需要检查你的业务,是否真的存在集中过期的代码,一般集中过期使用的命令是expireatpexpireat命令,在代码中搜索这个关键字就可以了。

如果你的业务确实需要集中过期掉某些 key,又不想导致 Redis 发生抖动,有什么优化方案?

解决方案是,在集中过期时增加一个随机时间,把这些需要过期的 key 的时间打散即可。

伪代码可以这么写:

# 在过期时间点之后的5分钟内随机过期掉
redis.expireat(key, expire\_time + random(300))

这样 Redis 在处理过期时,不会因为集中删除 key 导致压力过大,阻塞主线程。

另外,除了业务使用需要注意此问题之外,还可以通过运维手段来及时发现这种情况。

做法是我们需要把 Redis 的各项运行数据监控起来,执行info可以拿到所有的运行数据,在这里我们需要重点关注expired_keys这一项,它代表整个实例到目前为止,累计删除过期 key 的数量。

我们需要对这个指标监控,当在很短时间内这个指标出现突增时,需要及时报警出来,然后与业务报慢的时间点对比分析,确认时间是否一致,如果一致,则可以认为确实是因为这个原因导致的延迟增大。

实例内存达到上限

有时我们把 Redis 当做纯缓存使用,就会给实例设置一个内存上限maxmemory,然后开启 LRU 淘汰策略。

当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。

导致变慢的原因是,当 Redis 内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。

这个踢出旧数据的逻辑也是需要消耗时间的,而具体耗时的长短,要取决于配置的淘汰策略:

  • allkeys-lru:不管 key 是否设置了过期,淘汰最近最少访问的 key

  • volatile-lru:只淘汰最近最少访问并设置过期的 key

  • allkeys-random:不管 key 是否设置了过期,随机淘汰

  • volatile-random:只随机淘汰有设置过期的 key

  • allkeys-ttl:不管 key 是否设置了过期,淘汰即将过期的 key

  • noeviction:不淘汰任何 key,满容后再写入直接报错

  • allkeys-lfu:不管 key 是否设置了过期,淘汰访问频率最低的 key(4.0 + 支持)

  • volatile-lfu:只淘汰访问频率最低的过期 key(4.0 + 支持)

具体使用哪种策略,需要根据业务场景来决定。

我们最常使用的一般是allkeys-lruvolatile-lru策略,它们的处理逻辑是,每次从实例中随机取出一批 key(可配置),然后淘汰一个最少访问的 key,之后把剩下的 key 暂存到一个池子中,继续随机取出一批 key,并与之前池子中的 key 比较,再淘汰一个最少访问的 key。以此循环,直到内存降到maxmemory之下。

如果使用的是allkeys-randomvolatile-random策略,那么就会快很多,因为是随机淘汰,那么就少了比较 key 访问频率时间的消耗了,随机拿出一批 key 后直接淘汰即可,因此这个策略要比上面的 LRU 策略执行快一些。

但以上这些逻辑都是在访问 Redis 时,真正命令执行之前执行的,也就是它会影响我们访问 Redis 时执行的命令。

另外,如果此时 Redis 实例中有存储大 key,那么在淘汰大 key 释放内存时,这个耗时会更加久,延迟更大,这需要我们格外注意。

如果你的业务访问量非常大,并且必须设置maxmemory限制实例的内存上限,同时面临淘汰 key 导致延迟增大的的情况,要想缓解这种情况,除了上面说的避免存储大 key、使用随机淘汰策略之外,也可以考虑拆分实例的方法来缓解,拆分实例可以把一个实例淘汰 key 的压力分摊到多个实例上,可以在一定程度降低延迟。

fork 耗时严重

如果你的 Redis 开启了自动生成 RDB 和 AOF 重写功能,那么有可能在后台生成 RDB 和 AOF 重写时导致 Redis 的访问延迟增大,而等这些任务执行完毕后,延迟情况消失。

遇到这种情况,一般就是执行生成 RDB 和 AOF 重写任务导致的。

生成 RDB 和 AOF 都需要父进程fork出一个子进程进行数据的持久化,fork执行过程中,父进程需要拷贝内存页表给子进程,如果整个实例内存占用很大,那么需要拷贝的内存页表会比较耗时,此过程会消耗大量的 CPU 资源,在完成fork之前,整个实例会被阻塞住,无法处理任何请求,如果此时 CPU 资源紧张,那么fork的时间会更长,甚至达到秒级。这会严重影响 Redis 的性能

我们可以执行info命令,查看最后一次fork执行的耗时latest_fork_usec,单位微妙。这个时间就是整个实例阻塞无法处理请求的时间。

除了因为备份的原因生成 RDB 之外,在主从节点第一次建立数据同步时,主节点也会生成 RDB 文件给从节点进行一次全量同步,这时也会对 Redis 产生性能影响。

要想避免这种情况,我们需要规划好数据备份的周期,建议在从节点上执行备份,而且最好放在低峰期执行。如果对于丢失数据不敏感的业务,那么不建议开启 AOF 和 AOF 重写功能。

另外,fork的耗时也与系统有关,如果把 Redis 部署在虚拟机上,那么这个时间也会增大。所以使用 Redis 时建议部署在物理机上,降低fork的影响。

绑定 CPU

很多时候,我们在部署服务时,为了提高性能,降低程序在使用多个 CPU 时上下文切换的性能损耗,一般会采用进程绑定 CPU 的操作。

但在使用 Redis 时,我们不建议这么干,原因如下。

绑定 CPU 的 Redis,在进行数据持久化时,fork出的子进程,子进程会继承父进程的 CPU 使用偏好,而此时子进程会消耗大量的 CPU 资源进行数据持久化,子进程会与主进程发生 CPU 争抢,这也会导致主进程的 CPU 资源不足访问延迟增大。

所以在部署 Redis 进程时,如果需要开启 RDB 和 AOF 重写机制,一定不能进行 CPU 绑定操作!

开启 AOF

上面提到了,当执行 AOF 文件重写时会因为fork执行耗时导致 Redis 延迟增大,除了这个之外,如果开启 AOF 机制,设置的策略不合理,也会导致性能问题。

开启 AOF 后,Redis 会把写入的命令实时写入到文件中,但写入文件的过程是先写入内存,等内存中的数据超过一定阈值或达到一定时间后,内存中的内容才会被真正写入到磁盘中。

AOF 为了保证文件写入磁盘的安全性,提供了 3 种刷盘机制:

  • appendfsync always:每次写入都刷盘,对性能影响最大,占用磁盘 IO 比较高,数据安全性最高

  • appendfsync everysec:1 秒刷一次盘,对性能影响相对较小,节点宕机时最多丢失 1 秒的数据

  • appendfsync no:按照操作系统的机制刷盘,对性能影响最小,数据安全性低,节点宕机丢失数据取决于操作系统刷盘机制

当使用第一种机制appendfsync always时,Redis 每处理一次写命令,都会把这个命令写入磁盘,而且这个操作是在主线程中执行的

内存中的的数据写入磁盘,这个会加重磁盘的 IO 负担,操作磁盘成本要比操作内存的代价大得多。如果写入量很大,那么每次更新都会写入磁盘,此时机器的磁盘 IO 就会非常高,拖慢 Redis 的性能,因此我们不建议使用这种机制。

与第一种机制对比,appendfsync everysec会每隔 1 秒刷盘,而appendfsync no取决于操作系统的刷盘时间,安全性不高。因此我们推荐使用appendfsync everysec这种方式,在最坏的情况下,只会丢失 1 秒的数据,但它能保持较好的访问性能。

当然,对于有些业务场景,对丢失数据并不敏感,也可以不开启 AOF。

使用 Swap

如果你发现 Redis 突然变得非常慢,每次访问的耗时都达到了几百毫秒甚至秒级,那此时就检查 Redis 是否使用到了 Swap,这种情况下 Redis 基本上已经无法提供高性能的服务。

我们知道,操作系统提供了 Swap 机制,目的是为了当内存不足时,可以把一部分内存中的数据换到磁盘上,以达到对内存使用的缓冲。

但当内存中的数据被换到磁盘上后,访问这些数据就需要从磁盘中读取,这个速度要比内存慢太多!

尤其是针对 Redis 这种高性能的内存数据库来说,如果 Redis 中的内存被换到磁盘上,对于 Redis 这种性能极其敏感的数据库,这个操作时间是无法接受的。

我们需要检查机器的内存使用情况,确认是否确实是因为内存不足导致使用到了 Swap。

如果确实使用到了 Swap,要及时整理内存空间,释放出足够的内存供 Redis 使用,然后释放 Redis 的 Swap,让 Redis 重新使用内存。

释放 Redis 的 Swap 过程通常要重启实例,为了避免重启实例对业务的影响,一般先进行主从切换,然后释放旧主节点的 Swap,重新启动服务,待数据同步完成后,再切换回主节点即可。

可见,当 Redis 使用到 Swap 后,此时的 Redis 的高性能基本被废掉,所以我们需要提前预防这种情况。

我们需要对 Redis 机器的内存和 Swap 使用情况进行监控,在内存不足和使用到 Swap 时及时报警出来,及时进行相应的处理。

网卡负载过高

如果以上产生性能问题的场景,你都规避掉了,而且 Redis 也稳定运行了很长时间,但在某个时间点之后开始,访问 Redis 开始变慢了,而且一直持续到现在,这种情况是什么原因导致的?

之前我们就遇到这种问题,特点就是从某个时间点之后就开始变慢,并且一直持续。这时你需要检查一下机器的网卡流量,是否存在网卡流量被跑满的情况。

网卡负载过高,在网络层和 TCP 层就会出现数据发送延迟、数据丢包等情况。Redis 的高性能除了内存之外,就在于网络 IO,请求量突增会导致网卡负载变高。

如果出现这种情况,你需要排查这个机器上的哪个 Redis 实例的流量过大占满了网络带宽,然后确认流量突增是否属于业务正常情况,如果属于那就需要及时扩容或迁移实例,避免这个机器的其他实例受到影响。

运维层面,我们需要对机器的各项指标增加监控,包括网络流量,在达到阈值时提前报警,及时与业务确认并扩容。

总结

以上我们总结了 Redis 中常见的可能导致延迟增大甚至阻塞的场景,这其中既涉及到了业务的使用问题,也涉及到 Redis 的运维问题。

可见,要想保证 Redis 高性能的运行,其中涉及到 CPU、内存、网络,甚至磁盘的方方面面,其中还包括操作系统的相关特性的使用。

作为开发人员,我们需要了解 Redis 的运行机制,例如各个命令的执行时间复杂度、数据过期策略、数据淘汰策略等,使用合理的命令,并结合业务场景进行优化。

作为 DBA 运维人员,需要了解数据持久化、操作系统fork原理、Swap 机制等,并对 Redis 的容量进行合理规划,预留足够的机器资源,对机器做好完善的监控,才能保证 Redis 的稳定运行。


(完)

MarkerHub文章索引:(点击阅读原文直达)

https://github.com/MarkerHub/JavaIndex
【推荐阅读】
开源即责任

总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?

谈谈在Java中如何优雅地判空

SpringBoot 整合 Quartz 实现 JAVA 定时任务的动态配置

骚操作:不重启 JVM,如何替换掉已经加载的类?

记一次订单号重复的事故,快看看你的 UUID 在并发下还正确吗?

Spring如何实现AOP,请不要再说cglib了!

懵!啥是Java软引用、弱引用、虚引用?


好文章!点个在看!

T分布和T检验的理解,Python代码实现T检验的计算 每天学习一点,每天进步一点。 声明:本人所有的原创,都是自己在学习过程中的记录点滴,不一定都是对的,肯定也会有一些错误的想法。所以大家看一看就好,不可尽信。当然也欢迎指出。 T分布 定义,有来自标准正态分布的样本X ~ N(0,1),和来自卡方n分布的Y ~ X2(n), 那么有 Z= X/√(Y/n) 成为符合自由度为n的T分布 我们用Python代码画一下他的图形 # 给一个自由度,返回这个自由度的卡方分布 X²(n) def product(n): n = np.ceil(n).astype 阅读详情

相关推荐

Redis为什么变慢

一、Redis为什么变慢了对 Redis 进行基准性能测试例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。所以,你只有了解了你的 Redis 在生产环境服务器上的基准性能,才能进一步评估,当其延迟达到什么程度时,才认为 Redis 确实变慢了。为了避免业务服务器到 Redis 服务器之间的网络延迟,你需要直接在 Redis 服务器上测试实例的响应延迟情况。

Elvis Hu的博客 641

为什么我的Redis这么“慢”?常见延迟问题定位与分析

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草来源:kaito-kidd.com/推荐:https://www.xtt...

xmt1139057136的专栏 1843

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

Redis-排查Redis为什么变慢

Redis为什么变慢了?常见延迟问题定位与分析 Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用 Redis 时,经常时不时会出现访问延迟很大的情况,如果你不知道 Redis 的内部实现原理,在排查问题时就会一头雾水。 Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。 以下这篇文章我们就来分析一下 Redis 在使用过程中,经常会遇到的延迟问题以及如何定位和分析。 文章目录链路追踪基准性能使用了复杂度过高的命令操作、存储大的bigkey大量数据集

养歌的博客 2573

Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文

阅读本文大约需要 30 分钟。Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延...

HollisChuang's Blog 1923

Redis变慢的五大原因以及排查方法

一、 慢操作五大原因 如下图所示,主要分为与操作系统相关以及与Redis集群实例之间与内部相关两个方面 1. Redis实例之间以及内部数据传输阻塞(客户端、磁盘、主从通信、切片集群通信) 解决方法 — 主从集群时,限制主库RDB文件大小。 2. 多CPU多核架构(绑核,绑CPU) 解决方法—绑核绑CPU。 3. sql语句执行阻塞(慢查询、过期key) 解决方法—避免慢查询指令、客户端做聚合、对key设置不同的过期时间、使用异步线程删除bigkey。 4. AOF文件系统,RDB大内存页(A

skye_fly的博客 1万+

redis变慢了该如何排查?

不管什么工具,会使用永远只是第一步,第二步是当其出现某些问题时,拥有排查和修复问题的能力,而我们在使用Redis的过程中,变慢就是其中一个比较棘手的问题,因此本文就一起来看下,当遇到该类问题时应该如何排查,以求能够在工作中帮助到你,当然也更加是帮助我自己,下面我们就开始吧!1:获取Redis实例在当前环境下的基线性能。2:是否用了慢查询命令?如果是的话,就使用其他命令替代慢查询命令,或者把聚合计算命令放在客户端做。3:是否对过期key设置了相同的过期时间?

wang0907的博客 1406

Redis为什么变慢了?

阅读本文大约需要 30 分钟。Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作...

公众号:Java后端 372

天啊,为什么我的 Redis 变慢了。。

本文作者:Kaito 链接:kaito-kidd.com/2020/07/03/redis-latency-analysis/ Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。 很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。 这篇文章我们就来分析一下Redis在使用过程中,经常会遇到的延迟问题以及如何定位和分析。.

勇往直前的专栏 442

为什么我的 Redis 变慢

Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。 很多时候,Redis出现访问延迟变大,都与我们的使用不当或运维不合理导致的。 这篇文章我们就来分析一下Redis在使用过程中,经常会遇到的延迟问题以及如何定位和分析。 使用复杂度高的命令 如果在使用Redis时,发现访问延迟突然增大,如何进行排查? 首先,第一步,...

风水道人 225

Redis】浅谈Redis变慢的原因及排查解决方法

​ 本篇文章给大家带来了关于Redis的相关知识,其中主要介绍了浅谈Redis变慢的原因及排查方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面一起来看一下,希望对大家有帮助。

欢迎来到 程序猿 的博客 4010

Redis 的延迟问题,我找出原因并解决了!

GitLab 使用了大量 Redis,我们甚至为特定功能建立了单独的 Redis 集群。本文介绍的 Redis 实例的用途是 LRU 缓冲。这个缓存有慢性延迟的问题,两年多前开始间歇性地发生,最近几个月越来越糟,每隔几分钟,就会出现突发性的超高延迟,相应的吞吐量也会下降,导致 SLO(Service Level Objective,服务水平目标)恶化。这些延迟峰值影响了面向用户的响应时间,并耗费了大量相关功能的错误预算,所以我们要设法解决这个问题。

CSDN资讯 7503

redis变慢后的一些分析优化办法

1、使用复杂度过高的命令(例如SORT/SUION/ZUNIONSTORE/KEYS),或一次查询全量数据(例如LRANGE key 0 N,但N很大) 分析: a) 查看slowlog是否存在这些命令 b) Redis进程CPU使用率是否飙升(聚合运算命令导致) 解决: a) 不使用复杂度过高的命令,或用其他方式代替实现(放在客户端做) b) 数据尽量分批查询(LRANGE key 0 N,建议N<=100,查询全量数据建议使用HSCAN/SSCAN/ZSCAN) 2、操作bigkey 分析: a)

m0_57133702的博客 435

Redis--变慢原因及排查方法

Redis速度是很快的,性能很高。但是,Redis有时候会存在执行很慢、性能很差的情况。本文介绍Redis为什么变慢、解决方案。 Redis是单线程操作,如果在Redis中执行耗时较长的操作,就会阻塞其他请求了。 Redis客户端执行一条命令,分为4部分:发送命令=>命令排队=>命令执行=> 返回结果

IT利刃出鞘的博客 2万+

Redis 突然变慢了如何排查并解决?

如下检查清单,帮助你在遇到 Redis 性能变慢的时候能高效解决问题。获取当前 Redis 的基线性能;开启慢指令监控,定位慢指令导致的问题;找到慢指令,使用 scan 的方式;将实例的数据大小控制在 2-4GB,避免主从复制加载过大 RDB 文件而阻塞;禁用内存大页,采用了内存大页,生成 RDB 期间,即使客户端修改的数据只有 50B 的数据,Redis 需要复制 2MB 的大页。当写的指令比较多的时候就会导致大量的拷贝,导致性能变慢Redis 使用的内存是否过大导致 swap;

竹林幽深 1462

网络游戏-基于深度自编码网络的大压缩比卫星遥感图像压缩方法.zip

网络游戏-基于深度自编码网络的大压缩比卫星遥感图像压缩方法.zip

上一篇: 开源即责任
下一篇: 基于Spring Cloud微服务化开发平台Cloud-Platform完整解析
MarkerHub
博客等级 码龄6年 342粉丝 77原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值