debounce function for distributed system with redis and nodejs.
$ npm i -S node-distributed-debounce
and install redis
$ npm i -S redis
$ npm i -D @types/redis
example:
import { distributedDebounce } from 'node-distributed-debounce';
// const { distributedDebounce } = require('node-distributed-debounce');
import redis from 'redis';
const redisclient = redis.createClient();
function debouncedCall(index: number) {
distributedDebounce(() => {
console.log('called', index);
}, {
wait: 5, // sec
key: 'dist:debounce:call', // key for debounce
redisclient,
}).catch(e => console.error(e));
}
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
function main() {
for (let i = 0; i < 10; i++) {
debouncedCall(i);
await wait(100);
}
}
output:
called 9
- Q: Does it work with redis cluster?
- A: Yes.
FUNCTION DISTRIBUTED_DEBOUNCE(key, wait, callback)
ticket = MULTI
INCR(key)
EXPRE(key, wait)
EXEC
SLEEP(wait)
currentTicket = GET(key)
IF currentTicket != ticket
EXIT
END
IF SET(key_lock, '', NX, PX, 100) != OK
EXIT
END
callback()