Как запретить CouchDB создавать ревизии документов при обновлении простых счетчиков - PullRequest
5 голосов
/ 12 сентября 2011

Я хочу сохранить счетчики в документе CouchDB, увеличенные при каждом просмотре страницы. CouchDB создаст полную версию этого документа всего за 1 обновление счетчика.

Разве это не заняло бы слишком много места? Учитывая, что у меня есть 1M обращений в день, возможно, я смотрю 1M обращений к документу за день.

Есть мысли по этому поводу ...

Спасибо!

Ответы [ 5 ]

7 голосов
/ 13 сентября 2011

CouchDB очень четко говорит о компромиссах, которые он делает.В данном конкретном случае мы говорим о наличии базы данных, защищающей от сбоев, которая, к сожалению, может и будет использовать много дискового пространства до сжатия.

Вы получаете такую ​​надежность и много параллелизма для чтения.Вы также получите возможность бесшовной репликации с любыми другими узлами.Это бекон этого.Сжатие из-за разбитых счетчиков - это отстой.Забудьте о том, чтобы возиться с _rev_limit.Вы сделаете это, потому что изменения являются основополагающими для Couch.

Одна из ваших возможностей - регистрация информации, даты и времени, IP-адресов и прочего.Затем вы создадите представление, которое будет выдавать нужные вам данные и использовать _count в качестве функции приведения.Вы получите необходимую информацию и некоторые другие полезные материалы для аналитики.Это решение «просто создать представление».

Вторая возможность - использовать [redis] (http://redis.io/commands/incr). Redis довольно удобен и хорошо подходит для этого варианта использования (http://ai.mee.nu/is_couchdb_the_anti-redis). Это было бы решением «правильный инструмент для правильной работы».

Третья возможность - просто игнорировать его. Это может не быть проблемой вообще (если вы часто сокращаетесь).будьте «просто расслабляющим» решением.

Вы должны взять хорошее с плохим и убедиться, что преимущества перевешивают недостатки. Измерьте все дважды, прежде чем сокращать / оптимизировать.

3 голосов
/ 12 сентября 2011

Я не думаю, что это возможно.

Альтернативное решение - поместить счетчик в небольшой документ и периодически запускать сжатие .Это не оптимально, но минимизирует занимаемое пространство.

2 голосов
/ 11 апреля 2019

Если вам не нужна репликация, вы можете сохранить счетчик в _local doc. Локальные документы не имеют истории версий. Вы также можете сохранить их, не зная их ревизии. Они не копируются, последняя запись всегда побеждает.

Для создания / обновления документа _local просто используйте PUT /db/_local/[DOCID]

Вы можете получить свой _local документ с помощью GET /db/_local/[DOCID]

1 голос
/ 20 сентября 2011

Вы также можете рассмотреть возможность использования чего-то вроде memcached (или Membase) в качестве своего «счетчика памяти». Это позволит вам обновить эти счетчики без создания дополнительных ревизий в CouchDB. Я предполагаю, что вам на самом деле не нужно сохранять все промежуточные состояния счетчика (поскольку вы говорите, что не хотите, чтобы ревизии хранились рядом), поэтому имеет смысл поместить их в нечто, более подходящее для этого варианта использования.

0 голосов
/ 20 сентября 2011

Мы проводили небольшой эксперимент ...

Документ имел предельное значение 1000 оборотов по умолчанию, имел около 100 КБ вложений, 1 целочисленный счетчик, который мы продолжали увеличивать

В итоге мы получили около 4 ГБ диска, используемого примерно с 200 000 приращений. Использовано сжатие, и оно уменьшилось до 6 КБ.

Теперь это облом!

Мои серьезные опасения сейчас связаны с частым уплотнением (возможно, ежечасно / дважды в день / и т. Д.) На экземпляре с тяжелой записью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...