traduccion que jeff inc exchange error english atwood asp.net

asp.net - que - Contador de vista de página como en StackOverFlow



stack overflow stack exchange inc (7)

¿Cuál es la mejor manera de implementar el contador de vista de página como los que tienen aquí en el sitio donde cada pregunta tiene un contador "Vistas"?

Teniendo en cuenta los problemas de rendimiento y escalabilidad.


El contador que optimicé funciona así:

UPDATE page_views SET counter = counter + 1 WHERE page_id = x if (affected_rows == 0 ) { INSERT INTO page_views (page_id, counter) VALUES (x, 1) }

De esta manera, ejecuta 2 consultas para la primera vista, las otras vistas requieren solo 1 consulta.


Para mí, la mejor manera es tener un campo en la tabla de preguntas y actualizarlo cuando se acceda a la pregunta

UPDATE Questions SET views = views + 1 WHERE QuestionID = x

Objeto de aplicación: IMO no es escalable porque puede terminar con mucho consumo de memoria a medida que se acceden más preguntas.
Page_views tabla: no es necesario, tienes que hacer una costosa unión después


Puede implementar un IHttpHandler para hacer eso.


Soy un fanático del estilo de implementación de @ Guillaume. Utilizo un controlador GIF transparente y colas en memoria para agrupar conjuntos de cambios que luego se limpian periódicamente utilizando un subproceso separado creado en global.asax.

El manejador implementa IHttpHandler, procesa los parámetros de solicitud, por ejemplo, identificación de página, idioma, etc., actualiza la cola y luego response.writes el GIF transparente.

Al mover los cambios persistentes en un subproceso separado de la solicitud del usuario, también se maneja mucho mejor con posibles problemas de serialización al ejecutar varios servidores, etc.

Por supuesto, también puedes pagarle a otra persona para que haga el trabajo, por ejemplo, con gifs transparentes.


Una forma eficiente puede ser: almacenar sus contadores en el objeto Aplicación, puede persistir en el archivo / BD periódicamente y al cerrar la aplicación.


En lugar de hacer una llamada a la base de datos cada vez que se golpea la base de datos, incrementaría un contador utilizando un objeto de caché y dependiendo de cuántas visitas llegues a tu sitio cada día, debes enviar los hits de la página a la base de datos cada centésima visita al sitio. Esto es más rápido que la actualización de la base de datos en cada golpe.

Otra solución es analizar el archivo de registro de IIS y actualizar visitas cada 30 minutos a través de un servicio de Windows. Esto es lo que he implementado y funciona de maravilla.


Hice dos observaciones en el contador de vistas de :

  • Hay un elemento de link en el encabezado que maneja la activación de la actualización de recuento. Para esta pregunta, el marcado se ve así:
    <link href="/questions/246919/increment-view-count" type="text/css" rel="stylesheet" />
    Me imagino que podría presionar esa url para actualizar el conteo de visitas sin siquiera ver la página, pero no lo he intentado.

  • Tenía un ticket de voz de usuario , donde la respuesta de Jeff indicaba que las vistas no se incrementaban desde la misma ip dos veces seguidas.