2009-07-29 8 views

risposta

22

Sì.

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

prega di consultare il documentation per gli esempi molto dettagliate.

+0

Great thanks e nel mio caso l'ID utente, URL e nome sarebbe tutto essere un array all'interno di una serie di fino a 5.000 utenti, è così male? – JasonDavis

+4

Hai una REASON per archiviare record 5K in memcache? Penso che potresti perdere il punto di cache. – doomspork

+0

Dipende. Dato il mio semplice esempio, quell'array richiederebbe ~ 500 byte. Moltiplicando che per 5.000 sei a 2.5 MB. Questo è un oggetto piuttosto grande da attaccare in memcached. – hobodave

1

È possibile memorizzare quasi tutto ciò che si desidera in memcached.

Vedi la documentazione di memcache::set, che 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 

sono memorizzati serializzato.

Quindi, sì, è possibile memorizzare un array, o anche un oggetto, se necessario :-)


A proposito, è lo stesso con Memcache::add e Memcache::replace

+0

effettivamente aggiungere e sostituire non sono proprio la stessa cosa. aggiungi restituisce false se la chiave esiste già. – andufo

8

dimensione massima di un elemento di storage in memcache è 1.048.576 byte (1 MB), la serializzazione di un array richiede un po 'di spazio.

se si dovesse strutturare l'array nel modo più semplice:

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

chiave è generato automaticamente e il valore di essere l'id utente.

un array serializzato di 5000 utenti numerati 1-5000 utilizzando questa struttura ha una lunghezza di stringa di 67792 caratteri, 50000 utenti produce un array di 777794 caratteri.

la numerazione da 100.000 a 150000 produce una stringa serializzata di 838917 caratteri.

quindi a 50k utenti (come indicato nella domanda precedente), sarà probabilmente sotto il limite di 1 MB. se invece hai una cache locale (APC, ecc ...), usalo, o se per qualsiasi motivo NON hai bisogno di tutti gli ID contemporaneamente, ti consiglio caldamente di dividere i risultati o semplicemente di usare il DB.

pensa anche alla struttura dati che stai memorizzando in memcached. Se stai usando la cache semplicemente per darti un elenco di chiavi primarie da cercare, hai bisogno degli altri dati?

+0

Quello che sto cercando di realizzare è come un feed di un amico, la ragione per cui avrei bisogno di tutti gli ID utente è perché posso mostrare solo azioni nel feed che provengono dagli amici degli utenti. Sto cercando il modo migliore per farlo e sembra invece di fare più join su ogni caricamento di pagina per ottenere questi dati speravo di usare memcache per velocizzarlo e prendere un po 'di sforzo su mysql, di nuovo sto solo facendo ricerche un buon modo in questo momento quindi sono aperto a suggerimenti su tutto. – JasonDavis

+0

Se potessi memorizzare un elenco di amici e foto_url e nome utente che eliminerebbero come 2 join per recuperare foto e nome dalla tabella utente, e poi un altro alla tabella degli amici. La cosa brutta è un utente con 5k amici, anche se ho una lista degli amici in memoria, dovrei comunque usare IN (1,2,3,4) per cercare le azioni degli amici da mostrare ma penso che sarebbe essere più veloce quindi cercare tutto con mysql, anche questo feed nella home page dell'utente viene chiamato molto frequentemente, e non penso di poter memorizzare nella cache il feed degli amici perché è costantemente aggiornato. – JasonDavis

+0

L'elenco di amici dell'utente viene aggiornato spesso ma penso che potrei semplicemente memorizzarlo quando aggiungono un nuovo utente. Non dovrei 5k amici sarà il massimo che limiterò account per aggiungere solo che molti e molti molti account non avranno l'ammontare completo alcuni utenti avranno solo poche centinaia – 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); 
} 

aggiungere impostazione del database cambiamento secondo il requisito del ur, testato codice riprova

Problemi correlati