在分析阻塞式操作的异步执行的可行性前,先了解异步执行对操作的要求。
若一个操作能被异步执行,说明它不是Redis主线程关键路径上的操作。
客户端把请求发给Redis后,等Redis返回数据结果:
那Redis的写操作(如SET,HSET,SADD)属于关键路径吗?这需要客户端根据业务需要区分:
Redis读肯定都是关键路径操作,因为客户端发起读请求后,就会等待返回读取数据,再处理后续。 所以,都涉及读操作,无法异步!
推荐使用SCAN命令,分批读取数据,再在客户端进行聚合计算;
无需给客户端返回具体数据,所以不算关键路径操作。“大K删除”、“清空数据库”同理,都可用后台子线程异步执行。
为保证数据可靠性,Redis实例需保证AOF日志中的操作记录已落盘,这个操作虽需实例等待,但并不会返回具体数据结果给实例。所以,也可使用一个子线程执行AOF日志同步写。
从库想对客户端提供数据存取服务,须将RDB文件加载完成。所以,这也属于关键路径操作,必须让从库主线程执行。把主库的数据量大小控制在2~4GB左右,以保证RDB文件能以较快的速度加载。
综上,可使用Redis异步子线程机制实现大K删除,清空数据库及AOF日志同步写。