Memcached + PHP хранение данных и выборка + Уникальный счетчик IP + Referrer - PullRequest
1 голос
/ 28 июня 2011

Я хочу создать уникальный счетчик, который отслеживает подписчиков, каждого реферера и IP-адрес, с которого приходит пользователь. Memcached должен хранить эти данные и затем вводить их в базу данных через 5 минут или около того. А также он должен проверять дубликаты записей, которые не дважды записывают ip в БД

У меня есть идея сделать это без memcache, но чем каждую секунду что-то будет записано в базу данных, что замедлит работу сайта.

Я могу кэшировать базовый SQL с помощью memcache, но я понятия не имею, как сделать это выше, только что изучил кодирование. Так что я совершенно нуб:)

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 28 июня 2011
> 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 есть все команды, необходимые для этого эффективно , и постоянные снимки. Для подсчета просто используйте команды incrby / incr => decr / decbry .

Если вы установили memcached на свой компьютер, тогда установка redis будет очень сложной. Достаточно будет make. Популярный клиент для подключения к Redis из PHP: predis .

Если вы не можете установить программное обеспечение, у вас также есть возможность использовать бесплатный план (5 МБ памяти, 1 база данных, но без резервных копий) с http://redistogo.com. Чем вам нужно делать резервные копии в MySQL вручную, потому что снимки отключены по бесплатному плану (вероятно, лучше получить выделенную коробку или купить мини-план за 5 долларов в месяц).

0 голосов
/ 28 июня 2011

Насколько я понимаю - вы используете СУБД для хранения информации на длительный срок.Я могу предложить 2 вещи:

1.Сохраняйте информацию в хранилище ключей / значений, например Memcached, и периодически записывайте ее в RDBMS с помощью фонового процесса (задание CRON). С этим решением вы сделаете что-то подобное в своем коде приложения:

$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, в качестве основного средства долгосрочного хранения. Просто выберите ядро ​​базы данных с огромной пропускной способностью записи и вызовите его за день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...