¿Qué tan significativa es la diferencia de rendimiento entre el almacenamiento en memoria y en la base de datos [cerrado]

StackOverflow https://stackoverflow.com//questions/22000497

Pregunta

Estoy creando una aplicación de chat en Signalr.Actualmente tiene alguna funcionalidad de almacenamiento en una base de datos para el almacenamiento permanente de mensajes.Quiero implementar listas de usuarios y he estado releyendo este artículo:

http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#inmemory

¿Qué importancia tiene esta diferencia entre el almacenamiento en memoria?¿Es probable que haya más de un segundo de diferencia entre, digamos, 1.000 usuarios y 10.000 usuarios que se envían mensajes entre sí a una velocidad normal de, digamos, 1 mensaje por segundo (han consumido mucha azúcar)?¿Y qué tan útil es?Cualquier referencia a pruebas anteriores de rendimiento sería muy apreciada.

En segundo lugar, es posible que esté haciendo esto de manera incorrecta, pero si quiero almacenar una lista de usuarios y hay varias salas de chat, supongo que necesitaré un diccionario separado por sala.Y si es así, ¿es factible ya que quiero que los usuarios también puedan generar sus propias salas?Simplemente no veo cómo se puede lograr la memoria en memoria de esta manera.

Gracias

¿Fue útil?

Solución

Odio proporcionar un único enlace para una respuesta, pero esta sala de chat OSS completamente funcional https://jabbr.net aborda todo lo que te preocupa.

Fuente: https://github.com/jabbr/jabbr

Para comentar sobre su principal preocupación en memoria vs db:DB agrega la capacidad de conservar datos o incluso ampliar su aplicación, PERO tiene MUCHO menos rendimiento que en memoria.Ahora no me malinterpretes, aunque tiene MUCHO menos rendimiento, no significa que tomará unos segundos enviar mensajes dependiendo de tu aplicación...Se trata de compensaciones.

En cuanto a aplicar una arquitectura orientada a bases de datos a 1000 frente a 10 000 usuarios, todo depende de cómo la implemente.Por ejemplo, el proveedor de escalamiento horizontal REDIS ejecuta todo en memoria pero luego persiste en el disco en un intervalo.Obviamente, esto es extremadamente rápido pero permite "alguna" pérdida de datos.

Otros consejos

Esto no está directamente relacionado con su pregunta original.

Creo que no puedes guardarlos en el almacenamiento en memoria. El problema es que si el grupo de aplicaciones se recicla, todos los mensajes almacenados en la memoria desaparecerán.

No puede predecir cuándo se reciclará el grupo de aplicaciones (en total, puede establecer manualmente una hora específica para reciclar).Puede suceder en unos pocos días o en unas pocas horas.

Idealmente, desea almacenar en una ubicación persistente como Base de datos.Si le preocupa el rendimiento al guardar en la base de datos, puede asíncrono la tarea de guardar la base de datos.

Mira esta comparación:

http://ruturaj.net/redis-memcached-tokyo-tyrant-and-mysql-comparision/

Redis (en memoria) supera a MySQL (DB clásico) obviamente, sus campos de aplicación son muy diferentes, por lo que no podemos decir que, en general, Redis es mejor que MySQL.Cada proyecto de software es su propio mundo y se pueden aplicar muchas soluciones diferentes.En algunas situaciones, Redis y MySQL se usan juntos para diferentes partes de una plataforma (p. ej.Comercio electrónico Magento)

Depende de usted evaluar si necesita una solución en memoria o una base de datos estándar.Creo que se puede lograr fácilmente un rendimiento de 1 inserción/segundo a través de MySQL, pero esto es sólo una opinión.Le sugiero que escriba una implementación de su producto que sea "compatible con Redis":comience a usar MySQL, pero úselo a través de una capa de abstracción que se adapta tanto a MySQL como a Redis (no sé si dicha capa está disponible de código abierto, pero puede lanzar la suya propia...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top