Quiero almacenar contadores en un documento CouchDB, incrementado en cada vista de página. CouchDB creará una revisión completa de este documento para solo 1 actualización de contador.

¿No consumiría esto demasiado espacio? Teniendo en cuenta que tengo 1 millón de visitas en un día, podría estar viendo revisiones de 1 millón al documento en un día.

Tiene alguna idea sobre esto...

¡Gracias!

6
Mayank Jain 12 sep. 2011 a las 16:43

5 respuestas

La mejor respuesta

CouchDB es muy explícito sobre las compensaciones que hace. En este caso particular, estamos hablando de tener una base de datos a prueba de choques que, lamentablemente, puede y usará mucho disco hasta la compactación.

Obtiene con esta confiabilidad y mucha concurrencia para las lecturas. También obtendrá la capacidad de replicar sin problemas con cualquier otro nodo. Este es el tocino. Tener que compactar debido a los contadores golpeados es la succión. Olvídate de perder el tiempo con _rev_limit. Te fastidiarás haciéndolo porque las revisiones son muy fundamentales para Couch.

Una posibilidad que tiene es registrar cierta información, la fecha y la hora, las IP y otras cosas. Luego crearía una vista emitiendo los datos que necesita y utilizando _count como su función de reducción. Obtendrá la información que necesita y algunas otras cosas posiblemente valiosas para el análisis. Esta es la solución "solo crear una vista".

La segunda posibilidad sería usar [redis] (http://redis.io/commands/incr) . Redis es bastante agradable y encajaría bien con este caso de uso (http://ai.mee.nu/is_couchdb_the_anti -redis). Esta sería la solución "la herramienta adecuada para el trabajo adecuado".

La tercera posibilidad sería simplemente ignorarlo. Puede que no sea un problema en absoluto (si se compacta a menudo). Esta sería la solución "simplemente relajarse".

Debe tomar lo bueno con lo malo y asegurarse de que las ventajas superen a las desventajas. Mida todo dos veces antes de cortar / optimizar.

7
Flimzy 11 abr. 2019 a las 09:52

Si no necesita replicación, puede guardar el contador en un _local doc. Los documentos locales no tienen un historial de versiones. También puede guardarlos sin conocer su revisión. No se replican, la última escritura gana siempre.

Para crear / actualizar un documento local simplemente use PUT /db/_local/[DOCID]

Puedes recuperar tu _local doc con GET /db/_local/[DOCID]

2
Jay Bee 11 abr. 2019 a las 10:01

También puede considerar usar algo como memcached (o Membase) para servir como su "almacenamiento de contador". Eso le permitirá actualizar estos contadores sin crear revisiones adicionales en CouchDB. Supongo que en realidad no necesita mantener todos los estados intermedios del contador (ya que dice que no desea que se mantengan las revisiones), por lo que ponerlos en algo más adecuado para este caso de uso parece tener sentido.

1
Perry krug 20 sep. 2011 a las 01:14

No creo que sea posible.

Una solución alternativa sería colocar el contador en un documento pequeño y ejecutar compactación periódicamente. Esto no es óptimo, pero minimiza el espacio ocupado.

3
coyotte508 12 sep. 2011 a las 13:01

Nosotras estábamos haciendo un pequeño experimento ...

El documento tenía un límite predeterminado de 1000 revoluciones, tenía aproximadamente 100 kb de archivos adjuntos, 1 contador entero, que seguimos incrementando

Terminamos con aproximadamente 4 GB de disco utilizados para aproximadamente 200,000 incrementos. Compactación usada y se redujo a aproximadamente 6 KB.

Ahora que es un fastidio!

¡Mis preocupaciones serias ahora son: ejecutar compactación frecuente (tal vez por hora / dos veces al día / etc.) en una instancia de escritura pesada!

0
Mayank Jain 20 sep. 2011 a las 07:06