Redis / Memcached / MongoDB(或任何NoSQL系统)是否支持MySQL的ON DUPLICATE KEY UPDATE?

时间:2012-01-18 05:34:46

标签: mysql mongodb redis memcached nosql

我需要跟踪哪个用户访问了哪个页面多少次。

在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系统是否支持这样的功能?您将如何实现此目标以获得最高性能?

1 个答案:

答案 0 :(得分:9)

在MongoDB中,等效概念称为upsert(详细信息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更快,但是您牺牲了索引和查询的功能,以及数据模型的灵活性。这些是您需要根据您的具体情况决定的权衡。