Есть ли способ заставить базу данных MySql «обновляться»? - PullRequest
1 голос
/ 24 ноября 2010

У меня есть база данных mysql или, более конкретно, таблица mysql, в которой я храню IP-адреса.

Это потому, что я ограничиваю количество сообщений, отправляемых с моего сайта. Я просто проверяю, есть ли IP в таблице, и если это так, я говорю пользователю «замедлиться».

Есть ли способ заставить эту таблицу MySql хранить только строку (запись) в течение x минут?

Другие решения также приветствуются ...

Ответы [ 5 ]

2 голосов
/ 24 ноября 2010

Нет, но вы можете использовать поле TIMESTAMP , чтобы сохранить, когда строка была добавлена ​​/ изменена, и иногда удалять строки, которые старше x минут.

DELETE FROM your_table
WHERE your_timestamp < NOW() - interval 5 minute

Чтобы решитьТем не менее, реальная проблема, я бы предложил иметь таблицу со строкой для каждого пользователя и в последний раз, когда они отправили сообщение.Предполагая, что он проиндексирован правильно и ваши запросы эффективны, вам, вероятно, никогда не понадобится удалять какие-либо строки из этой таблицы, за исключением случаев, когда вы используете внешний ключ для пользовательской таблицы и удаляете соответствующего пользователя.Когда пользователь отправляет сообщение, вставьте строку, если она уже существует, в противном случае обновите существующую строку (вы можете использовать, например, для этого расширение MySQL REPLACE, если хотите).

0 голосов
/ 24 ноября 2010

Другие решения, использующие метку времени и задание cron, вероятно, являются лучшим вариантом, но если вы настаиваете на том, чтобы MySQL обрабатывал это сам, вы можете использовать Events . Они похожи на задания cron, за исключением того, что mysql сам выполняет планирование. Требуется 5.1+.

0 голосов
/ 24 ноября 2010

Один из подходов, который не включает удаление IP-адресов после определенного интервала, заключается в сохранении адресов как «временных» данных, то есть записей, которые действительны только в течение определенного периода.

Самый простой способ сделать это - добавить столбец отметки времени в таблицу и при вводе IP-адреса зафиксировать либо время, когда он был введен в таблицу, либо время, после которого он больше не является «ограниченным».

Код, который захватывает IP-адреса для ограничения, затем проверяет временную метку, чтобы определить, является ли она:

  • старше определенного порога (например, если вы записали IP-адресболее часа назад, игнорируйте его) или
  • текущее время больше, чем дата истечения срока хранения, хранящаяся там (например, если временная метка IP-адреса говорит 2010-11-23 23:59:59и это в прошлом, игнорируйте его)

в зависимости от того, какую метку времени вы выбрали для представления.

0 голосов
/ 24 ноября 2010

Я бы сделал столбец с меткой времени последнего отправленного сообщения, а другой - с общим количеством сообщений. Перед обновлением таблицы проверьте, прошло ли хотя бы X минут с момента последнего сообщения. Если это так, измените общее количество сообщений на 1, в противном случае увеличьте значение на 1.

0 голосов
/ 24 ноября 2010

Я бы рекомендовал вам добавить предложение WHERE, касающееся времени, в SELECT "просто проверьте, есть ли IP в таблице"

 SELECT * FROM table WHERE ip = <whatever> and timestamp > NOW() - 3*60

Тогда, может быть, один раз каждую ночь очищайте этот стол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...