Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis-Strings vs. Redis-Hashes zur Darstellung von JSON:Effizienz?

Dieser Artikel kann hier viele Einblicke geben:http://redis.io/topics/memory-optimization

Es gibt viele Möglichkeiten, ein Array von Objekten in Redis zu speichern (Spoiler :Ich mag Option 1 für die meisten Anwendungsfälle):

  1. Speichern Sie das gesamte Objekt als JSON-codierte Zeichenfolge in einem einzigen Schlüssel und verfolgen Sie alle Objekte mithilfe eines Satzes (oder einer Liste, falls angemessener). Zum Beispiel:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    Im Allgemeinen ist dies wahrscheinlich in den meisten Fällen die beste Methode. Wenn das Objekt viele Felder enthält, Ihre Objekte nicht mit anderen Objekten verschachtelt sind und Sie dazu neigen, jeweils nur auf eine kleine Teilmenge von Feldern zuzugreifen, ist es möglicherweise besser, sich für Option 2 zu entscheiden.

    Vorteile :gilt als "gute Praxis". Jedes Objekt ist ein vollständiger Redis-Schlüssel. Die JSON-Analyse ist schnell, insbesondere wenn Sie auf viele Felder für dieses Objekt gleichzeitig zugreifen müssen. Nachteile :langsamer, wenn Sie nur auf ein einzelnes Feld zugreifen müssen.

  2. Speichern Sie die Eigenschaften jedes Objekts in einem Redis-Hash.

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    Vorteile :gilt als "gute Praxis". Jedes Objekt ist ein vollständiger Redis-Schlüssel. JSON-Strings müssen nicht analysiert werden. Nachteile :möglicherweise langsamer, wenn Sie auf alle/die meisten Felder in einem Objekt zugreifen müssen. Außerdem können verschachtelte Objekte (Objekte innerhalb von Objekten) nicht einfach gespeichert werden.

  3. Speichern Sie jedes Objekt als JSON-String in einem Redis-Hash.

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    So kann man sich etwas konsolidieren und statt vieler Tasten nur noch zwei Tasten verwenden. Der offensichtliche Nachteil ist, dass Sie die TTL (und andere Dinge) nicht für jedes Benutzerobjekt festlegen können, da es sich lediglich um ein Feld im Redis-Hash handelt und nicht um einen vollständigen Redis-Schlüssel.

    Vorteile :JSON-Parsing ist schnell, insbesondere wenn Sie auf viele Felder für dieses Objekt gleichzeitig zugreifen müssen. Weniger "Verschmutzung" des Hauptschlüsselnamensraums. Nachteile :Ungefähr dieselbe Speichernutzung wie #1, wenn Sie viele Objekte haben. Langsamer als Nr. 2, wenn Sie nur auf ein einzelnes Feld zugreifen müssen. Wahrscheinlich nicht als "gute Praxis" angesehen.

  4. Speichern Sie jede Eigenschaft jedes Objekts in einem eigenen Schlüssel.

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    Laut obigem Artikel ist diese Option fast nie bevorzugt (es sei denn, die Eigenschaft des Objekts muss eine bestimmte TTL oder so etwas haben).

    Vorteile :Objekteigenschaften sind ausgewachsene Redis-Schlüssel, die für Ihre App möglicherweise nicht übertrieben sind. Nachteile :langsam, verbraucht mehr Arbeitsspeicher und gilt nicht als "Best Practice". Viel Verschmutzung des Hauptschlüssel-Namensraums.

Gesamtzusammenfassung

Option 4 wird im Allgemeinen nicht bevorzugt. Die Optionen 1 und 2 sind sehr ähnlich und beide sind ziemlich verbreitet. Ich bevorzuge Option 1 (im Allgemeinen), weil Sie damit kompliziertere Objekte (mit mehreren Verschachtelungsebenen usw.) speichern können. Option 3 wird verwendet, wenn es Ihnen wirklich wichtig ist darüber, den Hauptschlüssel-Namespace nicht zu verschmutzen (d. h. Sie möchten nicht, dass sich viele Schlüssel in Ihrer Datenbank befinden, und Sie kümmern sich nicht um Dinge wie TTL, Schlüssel-Sharding oder was auch immer).

Wenn ich hier etwas falsch gemacht habe, hinterlasse bitte einen Kommentar und erlaube mir, die Antwort zu überarbeiten, bevor ich abstimme. Vielen Dank! :)