2012-08-07 16 views
7

Sono una specie di newb con Redis, quindi mi scuso se questa è una domanda stupida.Redis è lento per ottenere stringhe grandi

Sto usando Django con Redis come cache.

Sto raccogliendo una raccolta di ~ 200 oggetti e memorizzandola in Redis.

Quando richiedo la raccolta da Redis, Django Debug Toolbar mi informa che la richiesta a Redis sta prendendo ~ 3 secondi. Devo fare qualcosa di terribilmente sbagliato.

  • il server ha 3,5 GB di ram, e sembra che Redis sta utilizzando solo ~ 50MB, quindi sono abbastanza sicuro che non è a corto di memoria.

  • Quando ho get la chiave utilizzando il Redis-cli ci vuole solo il tempo che quando lo faccio da Django

  • esecuzione strlen sulla chiave da Redis-CLI sto informato che la lunghezza è ~ 20 milioni (È troppo grande?)

Cosa posso fare per fare in modo che Redis restituisca i dati più velocemente? Se questo sembra insolito, quali potrebbero essere alcune trappole comuni? Ho visto this page in caso di problemi di latenza, ma ancora non mi è saltato fuori nulla.

Non sono sicuro se sia una pessima idea archiviare una grande quantità di dati in una chiave, o se c'è qualcosa di sbagliato nella mia configurazione. Qualsiasi aiuto o suggerimento o cose da leggere sarebbe molto apprezzato.

+0

Qualche possibilità che non sia necessario memorizzare gli interi oggetti/collezioni? –

risposta

16

Redis non è progettato per memorizzare oggetti molto grandi. Non è necessario memorizzare l'intera raccolta in una singola stringa in Redis, ma piuttosto utilizzare l'elenco di Redis o impostare come contenitore per i propri oggetti.

Inoltre, il formato pickle non è ottimizzato per lo spazio ... è necessario un formato più compatto. Protocol Buffers, MessagePack, o anche semplicemente JSON, sono probabilmente migliori per questo. Dovresti considerare di applicare un algoritmo di compressione leggero prima di memorizzare i tuoi dati (come Snappy, LZO, Quicklz, LZF, ecc ...).

Infine, la prestazione è probabilmente legata alla rete. Sulla mia macchina, il recupero di un oggetto da 20 MB da Redis richiede 85 ms (non 3 secondi). Ora, se eseguo lo stesso test usando un server remoto, ci vogliono 1.781 secondi, che è previsto su questa rete a 100 Mbit/s. La durata dipende completamente dalla larghezza di banda della rete.

Ultimo punto: assicurarsi di utilizzare una versione Redis recente: è stata eseguita una serie di ottimizzazioni per gestire oggetti di grandi dimensioni.

0

È molto probabilmente solo la dimensione della stringa. Guarderei se i tuoi oggetti vengono serializzati in modo efficiente.

Problemi correlati