Skip to content

Commit c0f2aa3

Browse files
authored
Add code for challenge redislabs-training#7
1 parent 8f2ccae commit c0f2aa3

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

src/daos/impl/redis/sliding_ratelimiter_dao_redis_impl.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,32 @@ const hitSlidingWindow = async (name, opts) => {
1111
const client = redis.getClient();
1212

1313
// START Challenge #7
14-
return -2;
14+
const key = keyGenerator.getKey(`limiter:${opts.interval}:${name}:${opts.maxHits}`);
15+
const now = timeUtils.getCurrentTimestampMillis();
16+
17+
const transaction = client.multi();
18+
19+
const member = `${now}-${Math.random()}`;
20+
21+
transaction.zadd(key, now, member);
22+
transaction.zremrangebyscore(key, 0, now - opts.interval);
23+
transaction.zcard(key);
24+
25+
const response = await transaction.execAsync();
26+
27+
const hits = parseInt(response[2], 10);
28+
29+
let hitsRemaining;
30+
31+
if (hits > opts.maxHits) {
32+
// Too many hits.
33+
hitsRemaining = -1;
34+
} else {
35+
// Return number of hits remaining.
36+
hitsRemaining = opts.maxHits - hits;
37+
}
38+
39+
return hitsRemaining;
1540
// END Challenge #7
1641
};
1742

0 commit comments

Comments
 (0)