前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >异步编程规避Redis的阻塞(下)

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

作者头像
JavaEdge
发布2022-09-27 20:16:44
2610
发布2022-09-27 20:16:44
举报
文章被收录于专栏:JavaEdgeJavaEdge

3 可异步执行的阻塞点

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

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

3.1 关键路径操作

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

  • 主线程接收到操作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日志同步写。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3 可异步执行的阻塞点
    • 3.1 关键路径操作
      • 3.2 各阻塞点分析
        • 3.2.1 集合全量查询和聚合操作
        • 3.2.2 删除操作
        • 3.2.3 AOF日志同步写
        • 3.2.4 从库加载RDB文件
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档