存储IP地址记录(DB替代)


Storing Record for IP Address (DB Alternative)

我需要为每个IP地址的用户存储一条记录,以限制某个IP地址可以执行操作的速率。

我知道将IP存储在数据库中可以工作,但我担心在资源有限的小型VPS上,MySQL进程会占用太多的处理能力。是否有另一种存储IP数据的方法?

我想到了一个类似的系统:

/ips/
/ips/127/
/ips/127/0
/ips/127/0/0
/ips/127/0/0/1.txt

示例代码:

$ip_parts = explode('.', $_SERVER['REMOTE_ADDR']);
$records = intval(file_get_contents('ips/' . implode('/', $ip_parts)));
if($records > 50) {
    echo 'Error - credits used.';
} else {
    // Do something
}

使用包含所需数据的1.txt文件。我是否会遇到文件或文件夹数量过多导致此方法比数据库慢的问题?

是什么让您认为构建自己的基于文件的数据库方案比由具有20年经验的软件工程师构建软件更好?只要使用MySQL数据库-很少有不这样做更好的情况-除非你真的想保存文件。

查看有关DBMS优化的ServerFault问题/答案。您正在尝试重新发明轮子,没有特别的原因(除非您永远不会在VPS上使用MySQL)。并且,在MySQL中存储IP地址时,请查看MySQL的INET_ATOI()函数。

使用文件系统也不是免费的,并且可能在多个点上导致大量的白发,因此我怀疑它是否真的比使用数据库更好。

也就是说,无论您最终使用文件还是数据库,您都可能想要了解ip2long和MySQL的等效INET_ATON。特别是如果你最终使用MySQL,因为数字键往往比字符串更有效。

你试过sqlite吗?它应该运行良好。

http://php.net/manual/en/book.sqlite.php