Memcached + PHP存储数据和获取+唯一的IP计数器+推荐人

时间:2011-06-28 09:24:42

标签: php mysql memcached

我想制作一个独特的计数器,用于跟踪用户来自的每个推荐人和IP。 Memcached应​​该存储该数据,并且应该在5分钟左右后将其输入数据库。并且它还应该检查重复的条目,不是ip写入DB的两倍

我有一个想法,没有内存缓存,但每一秒都会写入数据库,这会使网站变慢。

我可以使用memcache缓存基本的SQL,但我不知道如何使上面的内容,只是学习编码。所以我是一个完全的菜鸟:)

感谢您的帮助。

2 个答案:

答案 0 :(得分: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)作为长期存储的主要方式。 只需选择具有大量写入吞吐量的数据库引擎,并将其称为一天。

答案 1 :(得分: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 =&gt; decr / decbry命令。

如果你在盒子上安装了memcached,那么安装redis将会成为一个难题。只需make即可。从PHP连接到redis的流行客户端是predis

如果您无法安装软件,您还可以选择使用http://redistogo.com中的免费计划(5 MB内存,1个数据库,但无备份)。您需要手动备份到MySQL,因为快照是通过免费计划禁用的(可能更好的是获得一个专用的盒子或以每月5美元的价格购买迷你计划)。