Last active
December 2, 2020 10:35
-
-
Save RyosukeCla/c3257a3034f9399409e9c7b3902a171c to your computer and use it in GitHub Desktop.
distributed debounce function using redis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import redis from "redis"; | |
const redisclient = redis.createClient(); | |
async function distributedDebounce(callback: () => void, args: { ttl: number, key: string }) { | |
// update ttl. | |
await new Promise((resolve, reject) => { | |
redisclient.set(args.key, '', 'PX', args.ttl, (error, result) => { | |
if (error) return reject(error); | |
else return resolve(result); | |
}) | |
}); | |
// wait for ttl sec. | |
await wait(args.ttl); | |
// if key does not exists, then call callback. | |
const isExists = await new Promise<number>((resolve, reject) => { | |
redisclient.exists(args.key, (error, result) => { | |
if (error) return reject(error); | |
else return resolve(result); | |
}); | |
}); | |
if (isExists === 1) return; | |
// lock for atomicity | |
const ok = await new Promise<'OK' | null>((resolve, reject) => { | |
redisclient.set(`${args.key}_lock`, '', 'NX', 'PX', 100, (error, result) => { | |
if (error) return reject(error); | |
else return resolve(result); | |
}); | |
}); | |
if (!ok) return; | |
callback(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment