Можно хранить список из времён запросов, ключ IP.
"192.168.15.20": [11, 22, 33, 44],
"192.168.15.22": [10, 24, 35, 42, 46],
Смотреть его длину (< 100 ?), сравнивать текущее время с последним в списке.
Вставлять время разрешенного запроса в начало.
Приходит новый запрос. Дальше псевдокод:
const ip = request.ip;
const ts = Date.now();
const len = Redis.LLEN(ip);
if (len < 100) { // можно
Redis.LPUSH(ip, ts);
return true; // можно выполнять запрос
}
const last_ts = Redis.LRANGE(ip, -1, -1);
if ((ts - last_ts) < 864e5) { // меньше суток
return false;
} else {
Redis.LPUSH(ip, ts);
Redis.LTRIM(ip, 0, 99);
return true;
}
И наверное всё это стоит обернуть в MULTI .. EXEC, чтобы параллельные запросы с одного IP на внесли беспорядок.