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