我需要为每个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文件。我是否会遇到导致此方法比数据库慢的文件或文件夹数量问题?
答案 0 :(得分:3)
是什么让您认为构建自己的基于文件的数据库方案比具有20年经验的软件工程师的软件构建更好?只需使用一个MySQL数据库 - 很少有一种情况下不这样做会更好 - 除非你真的希望保存文件。
答案 1 :(得分:2)
在ServerFault上查看有关DBMS优化的this question / answer。你试图重新发明轮子没有特别的原因(除非你不会在那个VPS上使用MySQL)。而且,关于在MySQL中存储IP地址的主题,请查看MySQL的INET_ATOI()函数。
答案 2 :(得分:1)
使用文件系统也不是免费的,并且可能在多个点上造成很多白发,所以我怀疑它是否真的比使用数据库更好。
也就是说,无论您最终使用的是文件还是数据库,您可能都想了解ip2long
和MySQL的等效INET_ATON
。特别是如果你最终使用MySQL,因为数字键往往比字符串更有效。
答案 3 :(得分:0)
你试过sqlite吗?它应该运作良好。