2009-07-29 10 views
16

¿Puedes guardar una matriz en Memcache?¿Puedes guardar una matriz PHP en Memcache?

Me gustaría almacenar;

  1. Un ID de usuario número
  2. URL foto de un usuario
  3. usuarios un nombre

Juntos como una matriz, alguien me podrías dijo y luego alguien me dijo que no podía Qué ¿Lo es?

Respuesta

22

Sí.

Memcache::set('someKey', array(
    'user_id' => 1, 
    'url' => 'http://', 
    'name' => 'Dave' 
)); 

Por favor ver el documentation de ejemplos muy detalladas.

+0

Grandes gracias y en mi caso el identificador de usuario, URL, y todo nombre sería una matriz dentro de una gama de hasta 5.000 usuarios, ¿es malo? – JasonDavis

+4

¿Tiene una RAZÓN para almacenar 5K registros en Memcache? Creo que te puedes perder el punto de almacenamiento en caché. – doomspork

+0

Depende. Dado mi ejemplo simple, esa matriz tomaría ~ 500 bytes. Multiplicando eso por 5,000 estás en 2.5 MB. Ese es un objeto bastante grande para permanecer en memcached. – hobodave

1

Puede almacenar casi cualquier cosa que desee en memcached.

Consulte la documentación de memcache::set, que dice:

bool Memcache::set(string $key, mixed $var [, int $flag [, int $expire ]]) 

var

The variable to store. Strings and integers are stored as is, other types 

se almacenan en serie.

Así que, sí, puede almacenar una matriz, o incluso un objeto si es necesario :-)


Por cierto, es el mismo con el tamaño de almacenamiento y Memcache::addMemcache::replace

+0

realmente agregar y reemplazar no son lo mismo. add devuelve falso si la clave ya existe. – andufo

8

máximo de un elemento en Memcache es de 1.048.576 Bytes (1 MB), la serialización de una matriz ocupa un poco de espacio.

si se va a estructurar su matriz como simplemente como:

array(
    [0] => 1, 
    [1] => 2, 
    [2] => 3 
) 

clave es generada automáticamente y el valor es el ID de usuario.

una serie serializada de 5000 usuarios numerados 1-5000 utilizando esta estructura tiene una longitud de cadena de 67792 caracteres, 50000 usuarios produce una matriz de 777794 caracteres.

Numeración 100000 a 150000 produce una cadena serial de 838917 caracteres.

por lo que a los 50k usuarios (como se hace referencia en su pregunta anterior), es probable que esté por debajo del límite de 1 MB. sin embargo, si tiene un caché local (APC, etc.), utilícelo en su lugar, o si por algún motivo NO necesita todos los ID a la vez, le recomiendo dividir los resultados o simplemente usar el DB.

también piense en la estructura de datos que está almacenando en memcached. Si está utilizando el caché simplemente para darle una lista de las claves principales para la búsqueda, ¿necesita los otros datos?

+0

Lo que intento lograr es como un feed de amigos, la razón por la que necesitaría todos los ID de usuario es porque solo puedo mostrar acciones en el feed que son de los amigos de los usuarios. Estoy investigando la mejor manera de hacer esto y parece que en lugar de hacer varias uniones en cada carga de página para obtener estos datos. Esperaba usar Memcache para acelerarlo y quitarle algo de esfuerzo a MySQL, de nuevo solo estoy investigando una buena manera en este momento, así que estoy abierto a sugerencias sobre todo. – JasonDavis

+0

Si pudiera almacenar una lista de amigos de usuarios y photo_url y nombre de usuario que eliminen como 2 uniones para obtener fotos y nombre de la tabla de usuario, y luego otra tabla de amigos. Lo malo es que un usuario con 5k amigos, incluso si tengo allí una lista de amigos como una lista en la memoria, todavía tendría que usar IN (1,2,3,4) para buscar acciones de amigos para mostrar, pero creo que lo haría sea ​​más rápido que buscar todo con mysql, también se llama con frecuencia esta información en la página de inicio del usuario, y no creo que pueda guardar en caché el feed de amigos porque se actualiza constantemente. – JasonDavis

+0

La lista de amigos del usuario se actualiza a menudo, pero creo que podría recache cuando agreguen un nuevo usuario. No debería 5k amigos será la cuenta máxima que limitaré para agregar que muchas y muchas cuentas no tendrán la cantidad completa algunos usuarios solo tendrán unos pocos cientos – JasonDavis

2
$memcache = new Memcache; 
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect"); 

$id = $_REQUEST['name']; 
$key = md5("SELECT * FROM memc where FirstName='{$id}'"); 
$get_result = array(); 
$get_result = $memcache->get($key); 

if ($get_result) { 
    echo "<pre>\n"; 
    echo "FirstName: " . $get_result['FirstName'] . "\n"; 
    echo "Age: " . $get_result['Age'] . "\n"; 
    echo "</pre>\n"; 
} else { 
    $query="SELECT * FROM memc where FirstName='{$id}'"; 
    $result = mysql_query($query); 
    $row = mysql_fetch_array($result); 
    echo "<pre>\n"; 
    echo "FirstName: " . $row[1] . "\n"; 
    echo "Age: " . $row[3] . "\n"; 
    echo "Retrieved from the Database\n"; 
    echo "</pre>\n"; 
    $memcache->set($key, $row, MEMCACHE_COMPRESSED, 60); 
    mysql_free_result($result); 
} 

añadir configuración de base de datos de cambio de acuerdo con el requisito del ur, a prueba de código intenta

Cuestiones relacionadas