Redis
 sql >> Database >  >> NoSQL >> Redis

Stringhe Redis vs hash Redis per rappresentare JSON:efficienza?

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):

  1. 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.

  2. 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.

  3. 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".

  4. 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! :)