2017-06-17 2 views
2

Ich bin neu bei Redis, und ich bin nicht sicher, warum diese Abfrage so lange dauern würde. Es ist 7mb String im Wesentlichen von einem JSON-Objekt. Ich habe HGet key data und die Menge der Zeit, die es dauert 225 Millisekunden im Durchschnitt. Dies ist tatsächlich langsamer als der SQL-Server in derselben virtualisierten Umgebung. Sie haben die gleichen zugewiesenen Ressourcen.Redis 225 ms Abfrage des Hash-Werts

Die integrierte Latenz in der virtualisierten Umgebung ist nur etwa 9000 Mikrosekunden am schlimmsten.

Ich kann mich nicht einmal darum kümmern, wie etwas, das komplett im Speicher zwischengespeichert wird, länger dauert als die gleichen Daten in sql. Der Redis-Server benötigt etwa doppelt so lange. Hier ist ein Beispiel für die folgende Zeichenfolge.

[ {"name":"Christopher", "advocate": "John"}, {"name": "Jane", "advocate": "John"}, etc..]

Die SQL ist nur eine Tabelle mit den exakt gleichen Informationen.

| name  | advocate | 
| ---------- | -------- | 
| Christopher | John  | 
| Jane  | John  | 

Gibt es etwas, was ich für größere Objekte in Hash bin fehlt, die die Leistung verbessern würde? Ich kann niemanden rechtfertigen, Redis zu benutzen, wenn die genau gleiche Abfrage im Speicher langsamer ist als sql. Ich verstehe, sobald ich anfange, die Join-Komplexität in SQL zu erhöhen, konnte ich mehr Verbesserung sehen. Aber ich denke nur, dass es noch mehr gibt, die ich bei Redis vermissen könnte.

Ich kann mehr Details zur Verfügung stellen, wenn Sie so brauchen.

Antwort

1

Es ist nicht so überraschend.

SQL Server verwendet TDS, um die Daten zurückzugeben. Dieses Protokoll wurde entwickelt, um Tabellendaten effizient zurückgeben zu können. Es wiederholt nicht die Feldnamen für jede Zeile - was in Ihrem JSON-Objekt passiert. Meine Vermutung ist, dass die JSON-Darstellung tatsächlich größer ist als die TDS-Darstellung. Da dieser Anwendungsfall durch die Netzwerkbandbreite (mehr als die Latenzzeit) begrenzt ist, scheint Redis langsamer zu sein.

Beachten Sie, dass Redis nicht speziell für die Speicherung und Rückgabe von großen Objekten optimiert ist.

7 MB für 225 ms repräsentieren 31 MB/s. Es hängt natürlich von der Größe Ihrer Pipes ab, sieht aber für eine virtualisierte Umgebung nicht so schlecht aus.

+0

Was kann ich tun, um die Zeit zu verbessern? –

+0

Sie erwähnten Pipes. Wie kann ich die Größe meiner Pfeifen erhöhen? Sie haben auch erwähnt, dass es nicht dafür optimiert ist, wie kann ich große Objekte effizienter zurückgeben? Sollte ich diese Objekte in mehr Schlüsselwerte trennen, um die Größe zu verringern, und die JSON-Wiederholung von Feldern reduzieren und meine Schlüssel Repräsentationen dieser Objekte haben? –

+0

Wenn Sie nicht die JSON-Felder von Redis manipulieren müssen (dh nur Ihre Daten als großen Blob speichern) - dann würde ich vorschlagen, die Daten-Client-Seite mit einem leichten Komprimierungsalgorithmus (LZ4, Snappy, LZO, etc ...) zu komprimieren.). –