我需要跟踪哪个用户已经访问了哪个页面多少次。
在MySQL中,我会这样做:
INSERT INTO stats (user_id, url, hits)
VALUES (1234, "/page/1234567890", 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;在该表中,stats (user_id, url)为UNIQUE
为了这个目的,我正在寻找最快的系统。由于这只是为了统计数据,因此保持持久性并不重要。
Redis、MongoDB、Memcached或其他NoSQL系统支持这样的特性吗?您将如何实现这一点以获得最高性能?
发布于 2012-01-18 13:43:04
在MongoDB中,等效的概念称为upsert (detailed info here)。
这基本上意味着:“查找具有这个键的文档-如果它存在,则应用此更新。如果它不存在,则创建它并应用此更新。”
例如,在您的示例中,您可以在mongo中执行以下操作:
db.stats.update({user_id:1234, url:"/page/1234567890"}, {$inc:{hits:1}}, true)
第一次调用它(在一个空的数据库上)时,它会插入这个文档:
{user_id:1234, url:"/page/1234567890", hits:1}
后续调用将简单地递增hits的值。
在Redis中,您只需使用Redis INCR命令即可完成此操作,其中您的密钥基于将其限定为唯一密钥所需的值。第一次调用INCR时,如果该值不存在,则将其设置为1。例如:
INCR "uid:1234:url:/page/1234567890"
> 1
INCR "uid:1234:url:/page/1234567890"
> 2等。
至于如何实现最高性能,这取决于你所谓的“性能”是什么意思,以及你的用例是什么。例如,使用Redis INCR命令可能比MongoDB更快,但您牺牲了索引和查询功能,以及数据模型的灵活性。这些都是权衡,您需要根据您的特定情况来决定。
https://stackoverflow.com/questions/8905650
复制相似问题