2012-01-03 64 views
0

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

我知道将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文件。我会遇到导致此方法比数据库更慢的文件或文件夹数量问题吗?

+1

不要担心你的VPS - MySQL对此很好 - 做了很多次。 – 2012-01-03 15:54:56

+0

...或者你可以使用[SQLite](http://php.net/manual/en/book.sqlite.php)来避免运行一个单独的应用程序。 – DaveRandom 2012-01-03 15:56:05

+0

如果这是一个性能问题,你会遇到更大的问题。 – 2012-01-03 15:57:42

回答

2

在ServerFault上检出this question/answer关于DBMS优化。你试图重新发明轮子没有特别的原因(除非你不会在该VPS上使用MySQL)。而且,关于在MySQL中存储IP地址的主题,请查看MySQL的INET_ATOI()函数。

3

什么让你觉得建立自己的基于文件的数据库方案比软件构建为目的的软件工程师有20年的经验,更好地?只需使用一个MySQL数据库 - 很少有情况不这样做会更好 - 除非您真的希望保存文件。

+0

我不怀疑MySQL是否更好,我只知道它需要一个额外的过程来满足自己的内存要求。当资源紧张时,我会寻找任何减少的方法。 – jSherz 2012-01-03 15:57:57

+0

不执行任何操作的进程几乎不使用任何资源。 MySQL使用的资源是为了增加性能而决定的。这些是诸如缓存和索引等。所有这些让你的查询执行得更好的东西。通过这样做,我不仅意味着给你更快的结果,还可以通过减少IO开销来减少硬盘的工作量。 – kba 2012-01-03 16:00:44

1

使用文件系统也不是免费的,并且可能会在多个点上造成大量白发,所以我怀疑它是否会比使用数据库更好。

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

+0

我在另一篇文章中读到了关于ip2long的内容,如果我走下数据库路由,可能会使用它。谢谢。 – jSherz 2012-01-03 15:59:37