首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis / Memcached / MongoDB (或任何NoSQL系统)是否支持MySQL的重复密钥更新?

问Redis / Memcached / MongoDB (或任何NoSQL系统)是否支持MySQL的重复密钥更新?
EN

Stack Overflow用户
提问于 2012-01-18 13:34:46
回答 1查看 838关注 0票数 4

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

在MySQL中,我会这样做:

代码语言:javascript
复制
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系统支持这样的特性吗?您将如何实现这一点以获得最高性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。例如:

代码语言:javascript
复制
INCR "uid:1234:url:/page/1234567890"
> 1
INCR "uid:1234:url:/page/1234567890"
> 2

等。

至于如何实现最高性能,这取决于你所谓的“性能”是什么意思,以及你的用例是什么。例如,使用Redis INCR命令可能比MongoDB更快,但您牺牲了索引和查询功能,以及数据模型的灵活性。这些都是权衡,您需要根据您的特定情况来决定。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8905650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档