iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Redis阻塞的情况有哪些
  • 352
分享到

Redis阻塞的情况有哪些

2023-07-05 16:07:02 352人浏览 八月长安
摘要

这篇文章主要介绍“Redis阻塞的情况有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis阻塞的情况有哪些”文章能帮助大家解决问题。命令阻塞使用不当的命令造成客户端阻塞:keys * :获

这篇文章主要介绍“Redis阻塞的情况有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis阻塞的情况有哪些”文章能帮助大家解决问题。

命令阻塞

使用不当的命令造成客户端阻塞:

  • keys * :获取所有的 key 操作;

  • Hgetall:返回哈希表中所有的字段和;

  • smembers:返回集合中的所有成员;

这些命令时间复杂度是O(n),有时候也会全表扫描,随着n的增大耗时也会越大从而导致客户端阻塞。

SAVE 阻塞

大家都知道 Redis 在进行 RDB 快照的时候,会调用系统函数 fork() ,创建一个子线程来完成临时文件的写入,而触发条件正是配置文件中的 save 配置。

当达到我们的配置时,就会触发 bgsave 命令创建快照,这种方式是不会阻塞主线程的,而手动执行 save 命令会在主线程中执行,阻塞主线程。

同步持久化

当 Redis 直接记录 AOF 日志时,如果有大量的写操作,并且配置为同步持久化

appendfsync always

即每次发生数据变更会被立即记录到磁盘,因为写磁盘比较耗时,性能较差,所以有时会阻塞主线程。

AOF 重写

  • fork 出一条子线程来将文件重写,在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子线程创建新 AOF 文件期间,记录服务器执行的所有写命令。

  • 当子线程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。

  • 最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。

阻塞就是出现在第2步的过程中,将缓冲区中新数据写到新文件的过程中会产生阻塞

AOF 日志

AOF 的日志记录不像关系型数据库那样在执行命令之前记录日志(方便故障恢复),而是采用先执行命令后记录日志的方式。

原因就是 AOF 记录日志是不会对命令进行语法检查的,这样就能减少额外的检查开销,不会对当前命令的执行产生阻塞,但可能会给下一个操作带来阻塞风险。

这是因为 AOF 日志也是在主线程中执行的,如果在把日志文件写入磁盘时,磁盘写压力大,就会导致写盘很慢,进而导致后续的操作也无法执行了。

大 Key 问题

大 key 并不是指 key 的值很大,而是 key 对应的 value 很大。

大 key 造成的阻塞问题如下:

  • 客户端超时阻塞:由于 Redis 执行命令是单线程处理,然后在操作大 key 时会比较耗时,那么就会阻塞 Redis,从客户端这一视角看,就是很久很久都没有响应。

  • 引发网络阻塞:每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。

  • 阻塞工作线程:如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。

查找大 key

当我们在使用 Redis 自带的 --bigkeys 参数查找大 key 时,最好选择在从节点上执行该命令,因为主节点上执行时,会阻塞主节点。

  • 我们还可以使用 SCAN 命令来查找大 key;

  • 通过分析 RDB 文件来找出 big key,这种方案的前提是 Redis 采用的是 RDB 持久化。网上有现成的工具

    • redis-rdb-tools:python 语言写的用来分析 Redis 的 RDB 快照文件用的工具

    • rdb_bigkeys:Go 语言写的用来分析 Redis 的 RDB 快照文件用的工具,性能更好。

删除大 key

删除操作的本质是要释放键值对占用的内存空间。

释放内存只是第一步,为了更加高效地管理内存空间,在应用程序释放内存时,操作系统需要把释放掉的内存块插入一个空闲内存块的链表,以便后续进行管理和再分配。这个过程本身需要一定时间,而且会阻塞当前释放内存的应用程序。

所以,如果一下子释放了大量内存,空闲内存块链表操作时间就会增加,相应地就会造成 Redis 主线程的阻塞,如果主线程发生了阻塞,其他所有请求可能都会超时,超时越来越多,会造成 Redis 连接耗尽,产生各种异常。

删除大 key 时建议采用分批次删除和异步删除的方式进行。

清空数据库

清空数据库和上面 bigkey 删除也是同样道理,flushdb、flushall 也涉及到删除和释放所有的键值对,也是 Redis 的阻塞点。

集群扩容

Redis 集群可以进行节点的动态扩容缩容,这一过程目前还处于半自动状态,需要人工介入。

在扩缩容的时候,需要进行数据迁移。而 Redis 为了保证迁移的一致性,迁移所有操作都是同步操作。

执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,严重的时候会接触发集群内的故障转移,造成不必要的切换。

关于“Redis阻塞的情况有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Redis阻塞的情况有哪些

本文链接: https://www.lsjlt.com/news/353118.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis阻塞的情况有哪些
    这篇文章主要介绍“Redis阻塞的情况有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis阻塞的情况有哪些”文章能帮助大家解决问题。命令阻塞使用不当的命令造成客户端阻塞:keys * :获...
    99+
    2023-07-05
  • 浅谈Redis阻塞的9种情况
    目录命令阻塞SAVE 阻塞同步持久化AOF 重写AOF 日志大 Key 问题查找大 key删除大 key清空数据库集群扩容前两天去美团面试的陈同学回来了,看他满脸泄气的样子,准是没拿到 Offer。 听了他面试的经过,真...
    99+
    2023-03-24
    Redis 阻塞
  • Redis中AOF有哪些潜在的阻塞点
    这篇文章给大家分享的是有关Redis中AOF有哪些潜在的阻塞点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。AOF有哪些潜在的阻塞点1. Redis采用fork子进程重写AOF文...
    99+
    2024-04-02
  • php程序阻塞与非阻塞的区别有哪些
    本篇内容主要讲解“php程序阻塞与非阻塞的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php程序阻塞与非阻塞的区别有哪些”吧!PHP程序阻塞和非阻塞的区别是:阻塞调用结果返回之前,当...
    99+
    2023-06-29
  • 非阻塞情况下connect产生EINPROGRESS错误
    在非阻塞情况下,当调用connect函数时,如果连接无法立即建立,connect函数会立即返回,并且返回错误码EINPROGRESS...
    99+
    2023-09-28
    错误
  • Redis数据丢失的情况有哪些
    Redis 数据丢失的情况有以下几种:1. 服务器故障:当 Redis 服务器发生故障,比如硬件故障、断电等,可能导致 Redis ...
    99+
    2023-09-16
    Redis
  • java阻塞方法有哪些
    java中实现阻塞的方法有:1.sleep()方法,使线程在指定的时间内进入线程阻塞状态;2.yield()方法,暂停当前执行的线程,执行其他线程;3.join()方法,将指定的线程加入到当前线程;4.wait()方法,使线程进入阻塞状态;...
    99+
    2024-04-02
  • python线程阻塞模式有哪些
    在Python中,有几种常见的线程阻塞模式,包括:1. join()方法:在主线程中调用某个线程的join()方法,主线程会等待该线...
    99+
    2023-08-15
    python
  • session失效的情况有哪些
    会话失效的情况有以下几种:1. 超时:如果用户在一段时间内没有与服务器进行通信,会话可能会超时并失效。超时时间可以根据系统的需求进行...
    99+
    2023-09-21
    session
  • mysql锁失效的情况有哪些
    MySQL锁失效的情况主要有以下几种: 死锁:当多个事务互相等待对方持有的锁资源时,可能会产生死锁。MySQL会自动检测到死锁,...
    99+
    2023-10-24
    mysql
  • javascript深拷贝的情况有哪些
    这篇“javascript深拷贝的情况有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript深拷贝的情况有...
    99+
    2023-06-26
  • Java异步非阻塞编程的方式有哪些
    这篇文章主要讲解了“Java异步非阻塞编程的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java异步非阻塞编程的方式有哪些”吧!1 服务端执行,最简单的同步调用方式:缺陷:服务端...
    99+
    2023-06-20
  • CSS加载失败的情况有哪些
    这篇文章主要讲解了“CSS加载失败的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS加载失败的情况有哪些”吧!1、真正CSS加载失败 ...
    99+
    2024-04-02
  • SqlServer索引失效的情况有哪些
    表数据量过小或者分布不均匀,导致SQL Server查询优化器认为使用索引扫描的代价大于全表扫描,从而选择全表扫描而不是使用索引...
    99+
    2024-04-16
    SqlServer
  • innodb索引失效的情况有哪些
    数据量过大:当数据表中的数据量非常大时,索引可能会失效,因为MySQL可能会选择不使用索引而进行全表扫描,这样会导致查询性能下降...
    99+
    2024-03-14
    innodb
  • MySQL索引失效的情况有哪些
    这篇文章主要讲解了“MySQL索引失效的情况有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL索引失效的情况有哪些”吧!1.最左前缀原则在MySQL数据库中,联合索引遵守最左前缀...
    99+
    2023-07-05
  • Python爬虫在不被阻止的情况下抓取网站的技巧有哪些
    这篇文章主要讲解了“Python爬虫在不被阻止的情况下抓取网站的技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python爬虫在不被阻止的情况下抓取网站的技巧有哪些”吧!  1、检...
    99+
    2023-06-25
  • ie6出现错位的情况有哪些
    今天就跟大家聊聊有关ie6出现错位的情况有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。由于IE6的使用人群非常广泛,这就导致所有的网站开发人员...
    99+
    2024-04-02
  • MySQL中Index失效的情况有哪些
    数据分布不均匀:如果数据在索引列上的分布不均匀,会导致索引失效,因为MySQL会在索引树上不断地进行查找,当数据分布不均匀时,可...
    99+
    2024-04-23
    mysql
  • mysql不走索引的情况有哪些
    以下是一些可能导致MySQL不走索引的情况:1. 数据量太小:当数据量太小时,MySQL可能会选择全表扫描而不是使用索引。这是因为索...
    99+
    2023-09-20
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作