我想制作一个独特的计数器,用于跟踪用户来自的每个推荐人和IP。 Memcached应该存储该数据,并且应该在5分钟左右后将其输入数据库。并且它还应该检查重复的条目,不是ip写入DB的两倍
我有一个想法,没有内存缓存,但每一秒都会写入数据库,这会使网站变慢。
我可以使用memcache缓存基本的SQL,但我不知道如何使上面的内容,只是学习编码。所以我是一个完全的菜鸟:)
感谢您的帮助。
答案 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美元的价格购买迷你计划)。