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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 3 可异步执行的阻塞点在分析阻塞式操作的异步执行的可行性前,先了解异步执行对操作的要求。若一个操作能被异步执行,说明它不是Redis主线程关键路径上的操作。

3 可异步执行的阻塞点

在分析阻塞式操作的异步执行的可行性前,先了解异步执行对操作的要求。


若一个操作能被异步执行,说明它不是Redis主线程关键路径上的操作。


3.1 关键路径操作

客户端把请求发给Redis后,等Redis返回数据结果:

17.png


主线程接收到操作1后,由于操作1无需给客户端返回具体数据,所以,主线程可将其移交给后台子线程处理,同时只需给客户端返回“OK”。

操作1就不属关键路径操作,因其不用给客户端返回具体数据,所以可由后台子线程异步执行

子线程执行操作1时,客户端又向Redis实例发送操作2,而此时,客户端需使用操作2返回的具体数据结果。若操作2不返回结果,则客户端将一直处等待状态。

该操作需把结果返给客户端,所以是关键路径操作,主线程须立即执行完该操作。

那Redis的写操作(如SET,HSET,SADD)属于关键路径吗?这需要客户端根据业务需要区分:


若客户端依赖操作返回值的不同而处理不同业务逻辑,则HSET、SADD算关键路径,而SET操作不算关键路径


因为HSET和SADD操作,若field或member不存在,Redis返回1,否则返0。而SET操作返回的结果都是OK


若客户端不关心返回值,只关心数据是否写成功,则SET/HSET/SADD都不算关键路径,多次执行这些命令都是幂等的,这时可放到异步线程


若Redis设置maxmemory,但未设置淘汰策略,这三个操作也都算关键路径


因为若Redis内存超过maxmemory,再写入数据时,Redis返回的结果是OOM error,这种情况下,客户端需要感知有错误发生才行


3.2 各阻塞点分析


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

Redis读肯定都是关键路径操作,因为客户端发起读请求后,就会等待返回读取数据,再处理后续。

所以,都涉及读操作,无法异步!


推荐使用SCAN命令,分批读取数据,再在客户端进行聚合计算;


3.2.2 删除操作

无需给客户端返回具体数据,所以不算关键路径操作。“大K删除”、“清空数据库”同理,都可用后台子线程异步执行。


3.2.3 AOF日志同步写

为保证数据可靠性,Redis实例需保证AOF日志中的操作记录已落盘,这个操作虽需实例等待,但并不会返回具体数据结果给实例。所以,也可使用一个子线程执行AOF日志同步写。


3.2.4 从库加载RDB文件

从库想对客户端提供数据存取服务,须将RDB文件加载完成。所以,这也属于关键路径操作,必须让从库主线程执行。把主库的数据量大小控制在2~4GB左右,以保证RDB文件能以较快的速度加载。


综上,可使用Redis异步子线程机制实现大K删除,清空数据库及AOF日志同步写。

相关实践学习
基于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的阻塞(中)
磁盘I/O一般费时费力,需重点关注。所以Redis开发者也早就把Redis设计为: 子进程生成RDB AOF日志重写
68 0
|
NoSQL Redis 数据库
异步编程规避Redis的阻塞(上)
Redis重视影响Redis性能的因素,如: 命令操作 系统配置 关键机制 硬件配置
76 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