Попробуйте использовать Memcache, поиск будет намного быстрее.
Вы можете использовать IP-адрес для ключа.Прочитайте значение.Если он не существует, инициализируйте его 0, если это число, увеличьте его.Затем запишите его обратно с TTL 1 секунды или 10 секунд, или любой другой период, который вы хотите.Если количество превышает пороговое значение, было много запросов в период TTL, и вы можете заблокировать IP.
Обновление: я только что рассчитал, что установка обновленного значения снова даст ему новый TTL по крайней мере на одну секунду, поэтому IP-адрес может быть заблокирован, если он будет запрашивать <threshold>
запросов с непрерывными интервалами, составляющими чуть менее секунды ...
Я не думаю, что это делает этот ответ совершенно бесполезным, но об этом следует помнить, если вы хотите сделать буквальныйреализация того, что я описал.
Блокировка может выполняться постоянно (путем регистрации в базе данных) или на меньший период.Для этого вы также можете использовать MemCache, зарегистрировав маркер (например, «X») вместо счетчика и установив TTL на более длительный период.Сценарий счетчика должен проверить, не является ли значение для чтения 'X', иначе счетчик перезапишет блок.
Я бы выбрал для этого Memcache, даже если вы хотите, чтобы черный список оставался постоянным.Поиск (который вам нужно сделать для каждого запроса) выполняется намного быстрее.Вы можете сохранить черный список IP-адресов в базе данных и восстанавливать этот список периодически или, по крайней мере, после перезагрузки сервера.Таким образом, вы получаете постоянный черный список без дополнительных затрат на проверку базы данных при каждом запросе.