2009-07-29 30 views
22

que tienen una red socialSession VS File VS Memcache para un caché en PHP?

  • La tabla de usuarios es de alrededor de 60.000 filas

  • La mesa de amigos es de alrededor de 1 millón de filas (utilizados para determinar quién es su
    amigo)

Quiero hacer un feed de amigo, pared, como quiera llamarlo, mostrará cosas como la publicación de estado de usuario (publicaciones de tipo de twitter), se mostrará algunos artículos diferentes, pero para empezar solo será un estado de amigo y tal vez una publicación de blog.

Básicamente, solo verá contenido publicado con un ID de usuario que se encuentre en su lista de amigos.

He estado tratando de llegar a la mejor manera y no he llegado muy lejos, pero esta es mi última idea.

Actualmente la construcción de esta alimentación, tengo que

  1. Obtener la lista de amigos de ID en la mesa gran amigo

  2. Obtener los datos del flujo de la amiga ids del resultado anterior

  3. unirse a la tabla de usuario para obtener los editores cuadro URL y nombre de usuario

  4. luego unirse a la mesa de comentarios para obtener comentarios publicados en los artículos de un feed

Eso es una gran tarea de construir ese alimentación

tengo 3 ideas hasta ahora, aquí es donde su ayuda puede venir en

Opción Memcache:.

  1. Uso Memcache y almacenar en caché de un usuario friendlist como una matriz cuando el usuario se registra en el sitio, también cuando el usuario aprueba una nueva solicitud de amistad para un amigo que se añade a no lista, reconstruiría hay caché.
  2. Además de solo conseguir amigos, podría guardar allí la URL de la foto de los amigos y el nombre de usuario, esto aceleraría las cosas de nuevo al eliminar esta consulta al crear el feed de amigos.

opción de caché de archivos:

  1. hacer lo mismo que la opción Memcache hace pero guardar estos datos como una matriz a un archivo de caché en lugar de la memoria, entonces incluir este archivo caché en la página.

  2. no estoy seguro de que es el mejor método para un rendimiento entiendo tiendas de todo memcache en la memoria para que los amigos que tienen como 20.000 amigos que podrían utilizar una gran cantidad de memoria y una memoria caché de archivos serían solamente put en la memoria cuando los usuarios lo necesitan si estoy en lo correcto. También si hice el método de archivo, cuando un usuario registros fuera del sitio, me gustaría eliminar hay archivo de caché para la carpeta de caché no sería demasiado grande de archivos

Sesión opción de caché:

  1. Igual que el caché de archivos anterior, me di cuenta de que la sesión de datos se guarda en un archivo por lo que no habría que hacer que sea capaz de ser un caché?

Por favor, dame tus opiniones o cualquier consejo o información que tiene en esto, ya que no tengo mucho conocimiento de almacenamiento en caché, he leído mucho, pero a veces las ideas de otras personas ayudan mucho

+0

"datos de sesión se guardan en un archivo". Su afirmación anterior es incorrecta. La sesión se puede configurar para almacenar en la base de datos. El manejador de sesión predeterminado es archivo. – sudip

Respuesta

28

memcache es la mejor opción para un montón de razones:

  1. es muy rápido - Todo está en la memoria, y está muy optimizado para situaciones como la suya (y el almacenamiento en caché en general :)
  2. se distribuye - Esto significa tha t si tiene varios servidores web/de aplicaciones en ejecución, todos pueden acceder al mismo caché
  3. Puede agrupar varios servidores para Memcache - Si tiene unos pocos servidores que están relativamente subutilizados (o varios servidores de caché dedicados), puede agrupar a todos juntos en un gran caché
  4. es súper escalable (por las razones mencionadas antes)
  5. tiene gran soporte para PHP - El paquete PECL para memcache se ha actualizado recientemente con una gran cantidad de nueva bondad
  6. Usted incluso puede almacenar sus sesiones de usuario en Memcache, simplemente configúrelo en su archivo php.ini. Esto es mucho más rápido que almacenar sesiones en bases de datos, y permite que sus sesiones persistan en varios servidores web (si se encuentra en una situación de equilibrio de carga) ... esto también le dará a su sitio un poco de impulso de rendimiento ya que no es necesario para acceder al sistema de archivos/base de datos para obtener información de la sesión sobre cada solicitud.

... y muchos más;)

En cuanto a algunas de sus preocupaciones sobre la huella de la memoria caché de objetos individuales que tienes algunas opciones.Mi idea inicial es simplemente darles un giro, ver qué tan grandes son realmente estos elementos de caché (puedes encontrar varias cosas de código abierto para monitorear el uso real de la memoria caché, como los cactus). Creo que serán más pequeños de lo que piensas.

Si no es así, te sugiero que vuelvas a pensar tu estrategia de caché en cuanto a lo que realmente caches, por cuánto tiempo, etc. Tal vez podrías construir el feed a partir de varias cosas en el caché (es decir, caché datos de usuario individuales, y luego construir el feed para una persona de todos los elementos individuales en la memoria caché). Hay muchos artículos buenos en ese frente, simplemente búsquelos :)

+0

Gracias por la publicación muy informativa, también cuando mencionas cactus para medir el uso de RAM, ¿te refieres a medirlo en general o a medirlo mientras usas Memcache? Gracias – JasonDavis

+1

En realidad, hay un plugin de cactus para monitorear Memcache en sí ... le dará hits/errores, números numéricos, etc. –

+0

gracias No puedo esperar para probar Memcache, también descubrí que Facebook limita a las personas a 5.000 amigos por lo ¡Creo que voy a hacer eso también y eso ayudará más que a nada! – JasonDavis

1

El tamaño de objeto máximo predeterminado permitido en Memcache es de 1MB.

@jsaondavis: "los datos de la sesión se guardan en un archivo".

Su declaración anterior es incorrecta. La sesión se puede configurar para almacenar en la base de datos. La sesión predeterminada hadndler es archivo.

1

Redis sería una buena solución:

Aquí hay un hilo en el Redis vs. Memcached. Suena como Redis ha de almacenamiento de 512 MB en lugar del límite de 1 MB ... un poco diferente :)

Memcached vs. Redis?