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

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

最佳答案

在 MongoDB 中,等效的概念称为 upsert(详细信息 here。)

这基本上意味着:“使用此 key 查找文档 - 如果存在,则应用此更新。如果不存在,则创建它并应用此更新。”

例如,在您的情况下,您可以在 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 更快,但您牺牲了索引和查询功能以及数据模型的灵 active 。这些是您需要根据您的特定情况做出决定的权衡。

关于mysql - Redis/Memcached/MongoDB(或任何 NoSQL 系统)是否支持 MySQL 的 ON DUPLICATE KEY UPDATE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905650/

相关文章:

php - 为什么 Doctrine 返回的字段比我要求的多?

javascript - node.js 和 mysql 如果数据库中有 1,我如何获得 2?

php - 图像上传与形式发送内容

linux - 如何让 mongodb 服务在 ubuntu 15.10 桌面上不自动启动?

MongoDB - 查询嵌入文档

mongodb - 关于 _id 和嵌套对象

azure - 使用 ServiceStack 加密 Azure 上的 Redis 消息

redis - 如何使用 Redis 防止竞争条件?

redis - 如何在脚本中对 lua 表结果进行 zscan

php - 防止将 HTML 数据发布到表单文本框中