2012-01-03 74 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