异步编程规避Redis的阻塞(中)
2023-09-27 14:19:48 时间
2.2 磁盘交互阻塞点
2.2.1 AOF日志同步写
磁盘I/O一般费时费力,需重点关注。所以Redis开发者也早就把Redis设计为:
- 子进程生成RDB
- AOF日志重写
这俩操作由子进程负责执行,慢速的磁盘I/O就不会阻塞主线程。
但Redis直接记录AOF日志时,会根据不同写回策略对数据做落盘保存。
一个同步写盘操作耗时大约1~2ms,若大量写操作需记录在AOF日志,并同步写回,就会阻塞主线程。
2.3 主从节点交互阻塞点
2.3.1 从库加载RDB文件
在主从集群中,主库需生成RDB文件,并传输给从库。
主库在复制过程,创建、传输RDB都由子进程完成,不会阻塞主线程。
但对从库,它在接收了RDB文件后,需使用FLUSHDB命令清空当前数据库,恰好撞车三大阻塞点。
从库在清空当前数据库后,还要把RDB文件载入内存,RDB文件越大,加载越慢。
2.3.2 切片集群实例交互阻塞点
- 部署Redis切片集群时,每个Redis实例上分配的哈希槽信息,需在不同实例间传递
不过,哈希槽信息量不大 - 当需负载均衡或有实例数变化时,数据会在不同实例间迁移
而数据迁移是渐进式执行
所以,一般这两类操作对Redis主线程阻塞影响不大。
但若使用Redis Cluster,且同时正好迁移大key,就会阻塞主线程,因Redis Cluster使用的同步迁移。
当无大key时,切片集群的各实例在进行交互时一般不会阻塞主线程。
在主线程中执行以上操作,势必导致主线程长时间无法服务其它请求。
为避免阻塞式操作,Redis提供异步线程机制:Redis会启动一些子线程,把一些任务移交子线程,让它们在后台处理。使用异步线程机制执行操作,可以避免阻塞主线程。
以上这些阻塞式操作可以被异步执行吗?
相关文章
- 异步编程规避Redis的阻塞(下)
- 异步编程规避Redis的阻塞(上)
- 【数据库开发】Redis数据库服务器启动配置
- redis应用于基于黑名单于白名单设定的服务控制
- 为什么 Redis 单线程能达到百万+QPS?
- Redis 不仅仅是单线程
- 基于redis的分布式ID生成器
- Redis配置文件参数说明
- Redis Cluster in K3S
- 【Redis】Redis 中的多线程编程模型
- CentOS安装redis-audit 但执行时出错未解决 记录一下安装过程
- springboot 集成Redis单机
- 2022-03-16 k8s的operator-hub中的redis-operator的HandleRedisFinalizer处理
- 【云原生】Docker部署Redis
- 【Redis】Redis 数据库 安装、配置、访问 ( Redis 简介 | 下载 Redis 安装包 | 安装 Redis 数据库 | 命令行访问 Redis | 使用可视化工具访问 Redis )
- Java实现分布式锁-基于redis
- redis requires ruby version 2.2.2的解决方案
- Flink从socket读取数据sink到redis
- Redis slowlog慢查询
- 集群聊天服务器:如何解决跨服务器通信问题 | redis发布-订阅