Como crear un recordatorio con NODEJS y REDIS


Desde hace tiempo en algunos proyectos que he desarrollado necesitan añadir recordatorios por ejemplo para generar una alerta SMS cada 10 MINS o enviar un email cierta fecha para recordar generar un FACTURA.

Sin embargo estuve buscando por todo internet como generar esto a travez de NODEJS sobre tener un countdown o timer que se ejecutara en background y realizara cierta acción pero no lo logre.

Entonces se me ocurrió usar el expire de REDIS!

SI ya sabes por donde voy!, la solución fue detectar la fecha actual y la fecha en que queria hacer el recordatorio y con momentJS obtener la diferencia de tiempo en segundos y asignarle el expire al KEY

Entonces creaba un KEY en redis con el nombre RECORDATORIO_{IDMONGODB} con el script siguiente me conectaba y escuchaba los eventos cuando las keys expiran, buscaba en mi base de datos el objeto y realizaba el envio por email, sms o notificación PUSH.

 var client = redis.createClient(6379, '127.0.0.1');
 client.select(1);

 client.config('set', 'notify-keyspace-events', 'Ex', function(err, result) {
     console.log(err, result)

     const expired_subKey = '[email protected]__:expired';

     client.subscribe(expired_subKey, function() {
         client.on('message', (chan, key) => {
             //aqui nos va a notificar siempre que expire una key pero solo vamos aceptar las de tipo RECORDATORIO
             if (key.indexOf('RECORDATORIO') !== -1) {
                 //es de tipo alarm
                 var data = key.split('_');

                 console.log(data);
                 if (data[1]) {
                     //SEND EMAIL, SMS o notificacion push
                 }
             }
         });
     });
 });

En cuanto rendimiento desconozco que pasaria si tuvieramos MILES O MILLONES de recordatorios, hasta la fecha los he utilizado para expirar unas 1000 keys mensuales.

Gracias por leer y compartir este post, si haces pruebas con miles de keys seria de gran ayuda si compartes tus resultados!