Alright, the simplest would be is to setup a Redis-based queue. The idea is very simple: put the data in the queue, something like:
{
type: "reminder",
id: <DATABASE_BASED_ID>
triggerAt: <TIMESTAMP_FORMAT_OF_THE_TRIGGER_TIME>
}
Since this is a very cheap operation, the background workers can keep on checking for the reminders in the queue, and when they find one which has a triggerAt attribute with a value more than or equal to the current time, execute it: get the data, send the notification (use a push notification service), and then delete the job.
All is async. :)
If you need assistance in implementing this, feel free to contact me! I hope this helps! :)