Java 基于Redis的任务调度

Java 基于Redis的任务调度,java,spring,redis,Java,Spring,Redis,我需要建立一个程序,接收付款ID,并在30秒后发送一个请求到另一个web服务,以检查付款是否成功。 程序每分钟将接收500-1000个事务,所以我认为使用Java线程池执行此任务效率不高 我正在考虑使用Redis来保存需要检查的支付ID。 根据发出的时间逐个调用ID,每个ID必须在30秒后调用 据我所知,到目前为止,我可以使用设置键值数据类型: 设置ID时间戳 这是实施该计划的正确方法吗?你还有什么建议吗 我正在使用SpringBoot和PostgreSql作为数据库 用例似乎是延迟消息处理。这

我需要建立一个程序,接收付款ID,并在30秒后发送一个请求到另一个web服务,以检查付款是否成功。 程序每分钟将接收500-1000个事务,所以我认为使用Java线程池执行此任务效率不高

我正在考虑使用Redis来保存需要检查的支付ID。 根据发出的时间逐个调用ID,每个ID必须在30秒后调用

据我所知,到目前为止,我可以使用设置键值数据类型:

设置ID时间戳

这是实施该计划的正确方法吗?你还有什么建议吗


我正在使用SpringBoot和PostgreSql作为数据库

用例似乎是延迟消息处理。这里可以使用支持延迟消息处理的活动MQ/或RabbitMQ消息处理。
。如果它不适合您的用例,那么您可以使用固定的存储桶大小,通过碎片方式将消息存储在NOSQL DB Cassandra中。例如,事件安排在上午10:21:55,则存储桶为上午10:21:00。主进程将挑选符合条件的存储桶并分发给工作进程进行处理。

您可以使用redis zset排序集,它根据给定的分数按顺序存储元素,有关更多信息,您可以检查排序集的工作方式

例如:

zadd SET_NAME PAYMENT_ID ISSUED_TIME(EPOCH)
然后每隔大约10秒运行一个调度程序,该调度程序将根据分数从排序集获取付款ID,如:

zrangebyscore SET_NAME LONG.MIN_VALUE CURRENT_TIME

我希望这将对您的情况有所帮助

您需要在接收时间+30秒的准确时间运行付款支票请求,还是只需要在30秒后的任何时间运行?我不期望前者成为要求,但谁知道呢?然而,您的问题根本不是Java线程池,因为它可以轻松地支持如此小的负载。真正难看的部分将是付款检查请求等待时间,如果有必要,还将更新付款id的状态。处理付款检查服务的响应和失败案例的要求是什么?检查调用的预期执行时间是多少?@cool Payment check请求需要在30秒后的任何时间运行。请求等待时间为10秒,是的,它在收到响应后更新付款状态。如果失败,状态将保持挂起状态。