Skip to content

Instantly share code, notes, and snippets.

@RyosukeCla
Last active December 2, 2020 10:35
Show Gist options
  • Save RyosukeCla/c3257a3034f9399409e9c7b3902a171c to your computer and use it in GitHub Desktop.
Save RyosukeCla/c3257a3034f9399409e9c7b3902a171c to your computer and use it in GitHub Desktop.
distributed debounce function using redis
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