异步编程规避Redis的阻塞(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis重视影响Redis性能的因素,如:命令操作系统配置关键机制硬件配置

1 简介


Redis重视影响Redis性能的因素,如:


命令操作

系统配置

关键机制

硬件配置

要尽可能避免性能异常场景,还要做好异常应对方案。影响Redis性能的潜在风险:


Redis内部的阻塞式操作

CPU核和NUMA架构的影响

Redis关键系统配置

Redis内存碎片

Redis缓冲区

本文研究Redis内部的阻塞式操作及应对方案。


Redis的网络I/O和KV对读写都由主线程完成。若在主线程执行操作耗时太长,就会引起主线程阻塞。但Redis既有服务客户端请求的键值对增删改查操作,也有保证可靠性的持久化操作,还有主从复制时的数据同步操作。哪些会引起阻塞?

2 Redis的阻塞风险点


Redis要和不同对象交互,有着不同操作:


客户端

网络IO,KV对CRUD操作,DB操作

磁盘

生成RDB快照,记录AOF日志,AOF日志重写

主从节点

主库生成、传输RDB文件,从库接收RDB文件、清空数据库、加载RDB文件

切片集群实例

向其他实例传输哈希槽信息,数据迁移

16.png

2.1 客户端交互

网络I/O有时较慢,但Redis使用的I/O多路复用,避免了主线程一直处在等待网络连接或请求到来的状态,所以,网络I/O并非导致Redis阻塞因素。


2.1.1 集合全量查询和聚合操作

KV对的crud操作是Redis和客户端交互的主要部分,也是Redis主线程执行的主要任务。所以,复杂度高的crud操作势必阻塞Redis。


最基本标准,就是看操作复杂度是否为O(N)。Redis中涉及集合的操作复杂度通常为O(N):


集合元素全量查询操作,如HGETALL、SMEMBERS

集合的聚合统计操作,如交、并差集

2.1.2 删除大key

集合自身的删除也可能阻塞。


不就是直接把数据删除,咋还能阻塞主线程?


删除操作的本质是释放KV对占用的内存空间。不要小瞧内存释放的过程。

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

所以,若突然释放大量内存,空闲内存块链表操作时间就会增加,就会造成Redis主线程阻塞。


那啥时释放大量内存呢?


就是在删除大量KV对数据时,最常见的就是删除包含大量元素的集合,即删除bigkey。

不同元素数量的集合在进行删除操作时所消耗的时间:

15.png


当元素数量从10w 到 100w时,集合类型的删除时间增长幅度从5倍上升到近20倍

集合元素越大,删除所花费的时间就越长

当删除有100w个元素的集合时,最大的删除时间绝对值已经达到了1.98s(Hash类型)。Redis的响应时间一般在微秒级别,所以,一个操作达到了近2s,不可避免阻塞主线程!

删除操作其实对Redis性能debuff很严重,在实际业务开发时还很容易被忽略。


2.1.3 清空数据库

同上,Redis的数据库级别操作中,清空数据库,如FLUSHDB、FLUSHALL等也是重大阻塞风险,涉及删除、释放所有KV对。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
运维 监控 NoSQL
Redis 分享-AOF的阻塞简单记录
公司分享讨论一些东西 拿出来大家分享讨论下
695 0
Redis 分享-AOF的阻塞简单记录
|
11月前
|
存储 NoSQL Redis
Redis del bigkey即使开启了lazyfree,为什么还是阻塞的,但是别人又不阻塞?why
Redis del bigkey即使开启了lazyfree,为什么还是阻塞的,但是别人又不阻塞?why
|
NoSQL Redis 数据库
异步编程规避Redis的阻塞(下)
3 可异步执行的阻塞点 在分析阻塞式操作的异步执行的可行性前,先了解异步执行对操作的要求。 若一个操作能被异步执行,说明它不是Redis主线程关键路径上的操作。
71 0
|
负载均衡 NoSQL Redis
异步编程规避Redis的阻塞(中)
磁盘I/O一般费时费力,需重点关注。所以Redis开发者也早就把Redis设计为: 子进程生成RDB AOF日志重写
68 0
|
缓存 NoSQL API
一对一直播平台开发,导致Redis阻塞的原因和解决方式
一对一直播平台开发,导致Redis阻塞的原因和解决方式
|
NoSQL 关系型数据库 MySQL
Redis实现并发阻塞锁方案
由于用户同时访问线上的下订单接口,导致在扣减库存时出现了异常,这是一个很典型的并发问题,本篇文章为解决并发问题而生,采用的技术为Redis锁机制+多线程的阻塞唤醒方法。
|
NoSQL Redis
Redis 阻塞(学习笔记七)
1、持久化引起的主线程阻塞操作:fork阻塞、AOF刷盘阻塞、HugePage写操作阻塞 2、
734 0
|
4天前
|
存储 监控 负载均衡
redis 集群 (主从复制 哨兵模式 cluster)
redis 集群 (主从复制 哨兵模式 cluster)
|
20天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
196 2
|
20天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
191 2