Поддерживает ли Redis / Memcached / MongoDB (или любые системы NoSQL) MySQL ON UP DUPLICATE KEY UPDATE? - PullRequest
4 голосов
/ 18 января 2012

Мне нужно отслеживать, какой пользователь посещал какую страницу и сколько раз.

В 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 Ответ

9 голосов
/ 18 января 2012

В MongoDB эквивалентная концепция называется upsert (подробная информация здесь .)

Это в основном означает: «Идите искать документ с этим ключом - если он существует,примените это обновление. Если оно не существует, создайте его и примените это обновление. "

Так, например, в вашем случае вы можете сделать что-то подобное в 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, но вы жертвуете возможностями индексирования и запросов, а также гибкостью вашей модели данных.Это компромиссы, которые вам нужно будет решить исходя из конкретной ситуации.

...