2011-06-28 23 views
1

我想製作一個獨特的計數器,跟蹤用戶來自哪裏的每個推薦人和ip。 Memcached應​​該存儲這些數據,並且應該在5分鐘左右後將其輸入到數據庫中。並且它應該檢查重複條目,而不是兩次IP寫入數據庫Memcached + PHP存儲數據和提取+獨特的IP計數器+推薦人

我有一個想法沒有memcache,但每秒都會寫入數據庫,這會使網站變得緩慢。

我可以用memcache緩存基本的SQL,但我不知道如何使上述,只是學習編碼。所以我是一個完全noob :)

謝謝你的幫助。

+0

如果你使用Apache,它將會在Apache訪問日誌中,爲什麼不使用它。 – 2011-06-28 09:28:18

+0

如果你使用統計數據有許多腳本使用Apache訪問日誌,或谷歌分析是流行的。 – 2011-06-28 09:30:09

+0

啊哈,我會怎麼做?那會比我想要做到的還要快嗎? – MasterX

回答

0

據我所知 - 您正在使用RDBMS來長期存儲信息。我可以推薦兩件事:

1.將信息存儲在鍵/值存儲區(如Memcached)中,並通過後臺進程(CRON作業)定期將其寫入RDBMS。 有了這個解決方案,你會做這樣的事情在你的應用程序代碼:

$m = new Memcached(); 
$m->addServer('localhost', 11211); 
$m->setOption(Memcached::OPT_COMPRESSION, false); 
$m->append('some_unique_id', '|' . time() . ':' . base64_encode($_SERVER['HTTP_REFERER'])); 

然後你將有一個cron作業做這樣的事情:

$m = new Memcached(); 
$m->addServer('localhost', 11211); 

foreach($list_of_unique_ids as $uid) 
{ 
    $raw_data = $m->get($uid); 
    $m->delete($uid); 

    $uid_safe = mysql_real_escape_string($uid); 

    $items = explode('|', $raw_data); 
    $sql = array(); 
    foreach($items as $rec) 
    { 
     if (!empty($rec)) 
     { 
      list($timestamp, $ref_base64) = explode(':', $rec, 2); 
      $ref = base64_decode($ref_base64); 
      $ref_safe = mysql_real_escape_string($ref); 

      $sql[] = "('" . $uid_safe . "', " . (int) $timestamp . ", '" . $ref_safe . "')"; 
     } 
    } 

    mysql_query("INSERT INTO some_table (user_id, ts, ref) VALUES " . implode(',', $sql)); 
} 

2.使用更先進的鍵/值存儲,如Redis或MongoDB作爲長期存儲的主要手段。 只需選擇一個具有巨大寫入吞吐量的數據庫引擎,並將其稱爲一天。

+0

謝謝你的回答是啊,那是尋找,但現在我認識後谷歌搜索爲什麼附加命令不工作,我有我的xampp服務器和專用服務器上安裝「memcache」not memcached(發現它提供了兩個不同的版本: ()。我檢查php.net的memcache append,但沒有運氣,你知道,如果這樣的命令給memcache – MasterX

+0

老實說,這個解決方案是遠非理想。我建議使用MongoDB方法。 –

+0

謝謝你,我只是做了它其他,我寫的所有數據在txt文件中,並使用cronjob刪除/更新數據更新MySQL數據庫。 – MasterX

0
> i want make an unique counter which 
> tracks following, every referrer and 
> ip from where the user comes. 
> Memcached should store that data and 
> than it should be entered into the 
> database after 5 mins or so. And also 
> it should check for duplicate entries 
> that not twice the ip is written to 
> the DB 

我會建議你使用redis來實現這一點,因爲Redis的有做到這一點efficiently所需的所有命令和具有persistent快照。要計算您只需使用incrby/incr =>decr/decbry命令。

如果你在你的盒子上安裝了memcached,那麼安裝redis將是一個罪惡。只需make就夠了。連接到PHP的redis的流行客戶端是predis

如果您不能安裝軟件,您還可以選擇使用http://redistogo.com的免費計劃(5 MB內存,1個數據庫,但不備份)。你需要手動備份到MySQL,因爲快照是免費計劃禁用的(可能更適合購買專用盒子或購買每月5美元的迷你計劃)。