Questo articolo può fornire molte informazioni qui:http://redis.io/topics/memory-optimization
Esistono molti modi per archiviare una serie di oggetti in Redis (spoiler :Mi piace l'opzione 1 per la maggior parte dei casi d'uso):
-
Archivia l'intero oggetto come stringa con codifica JSON in un'unica chiave e tieni traccia di tutti gli oggetti utilizzando un set (o un elenco, se più appropriato). Ad esempio:
INCR id:users SET user:{id} '{"name":"Fred","age":25}' SADD users {id}
In generale, questo è probabilmente il metodo migliore nella maggior parte dei casi. Se ci sono molti campi nell'oggetto, i tuoi oggetti non sono nidificati con altri oggetti e tendi ad accedere solo a un piccolo sottoinsieme di campi alla volta, potrebbe essere meglio andare con l'opzione 2.
Vantaggi :considerata una "buona pratica". Ogni oggetto è una chiave Redis in piena regola. L'analisi JSON è veloce, soprattutto quando è necessario accedere a molti campi per questo oggetto contemporaneamente. Svantaggi :più lento quando devi accedere a un solo campo.
-
Archivia le proprietà di ogni oggetto in un hash Redis.
INCR id:users HMSET user:{id} name "Fred" age 25 SADD users {id}
Vantaggi :considerata una "buona pratica". Ogni oggetto è una chiave Redis in piena regola. Non è necessario analizzare le stringhe JSON. Svantaggi :possibilmente più lento quando è necessario accedere a tutti/la maggior parte dei campi in un Oggetto. Inoltre, gli oggetti nidificati (Oggetti all'interno di oggetti) non possono essere archiviati facilmente.
-
Archivia ogni oggetto come stringa JSON in un hash Redis.
INCR id:users HMSET users {id} '{"name":"Fred","age":25}'
Questo ti permette di consolidare un po' e usare solo due chiavi invece di tante chiavi. L'ovvio svantaggio è che non puoi impostare il TTL (e altre cose) su ciascun oggetto utente, poiché è semplicemente un campo nell'hash Redis e non una chiave Redis in piena regola.
Vantaggi :L'analisi JSON è veloce, soprattutto quando è necessario accedere a molti campi per questo oggetto contemporaneamente. Meno "inquinante" dello spazio dei nomi della chiave principale. Svantaggi :Circa lo stesso utilizzo della memoria del n. 1 quando hai molti oggetti. Più lento del n. 2 quando devi accedere a un solo campo. Probabilmente non è considerata una "buona pratica".
-
Memorizza ogni proprietà di ogni Oggetto in una chiave dedicata.
INCR id:users SET user:{id}:name "Fred" SET user:{id}:age 25 SADD users {id}
Secondo l'articolo precedente, questa opzione è quasi mai preferito (a meno che la proprietà dell'oggetto non debba avere un TTL specifico o qualcosa del genere).
Vantaggi :le proprietà dell'oggetto sono chiavi Redis complete, che potrebbero non essere eccessive per la tua app. Svantaggi :lento, utilizza più memoria e non è considerato "best practice". Molto inquinante lo spazio dei nomi della chiave principale.
Riepilogo generale
L'opzione 4 non è generalmente preferita. Le opzioni 1 e 2 sono molto simili e sono entrambe piuttosto comuni. Preferisco l'opzione 1 (in generale) perché ti consente di memorizzare Oggetti più complicati (con più livelli di annidamento, ecc.) L'opzione 3 viene utilizzata quando ti interessa davvero sul non inquinare lo spazio dei nomi della chiave principale (cioè non vuoi che ci siano molte chiavi nel tuo database e non ti interessano cose come TTL, partizionamento orizzontale delle chiavi o altro).
Se ho sbagliato qualcosa qui, per favore considera di lasciare un commento e di permettermi di rivedere la risposta prima di effettuare il downvoting. Grazie! :)