1

Unser verteiltes Speicherprojekt mit LevelDB als Speicher-Engine und memcached als Cache-Layer haben wir ein Szenario: 95% Abfragen mit Schlüsseln sind nicht in der Speicher-Engine vorhanden.Speicher-Engine: wie schnell zu finden, dass der Schlüssel nicht existiert

In Memcached-Ebene, wenn den Schlüssel nicht finden kann, dann Abfrage LevelDB.

In LevelDB verwenden wir Standardbloomfilter, um herauszufinden, ob der Schlüssel existiert oder nicht, aber immer noch 1% falsch positive Rate. Wegen des 1% -Prozentsatzes müssen wir den Wert über IO anfordern, was vom Kunden nicht toleriert werden kann. (95% Schlüssel sind nicht vorhanden)

Gibt es eine bessere Lösung zu wissen, ob der Schlüssel nicht existiert?

Update: 1. Schlüssel werden jeden Tag generiert (Benutzer-ID + Datum), einmal kann nicht den Schlüssel erhalten, dann würde Client den Wert in Speicherschicht setzen. 2. Client lesen wollen Latenz (TP99) < x ms (Client ist Latenz sensitiv)

+0

Vielleicht möchten Sie den Benutzerzugriff pro Tag aufzeichnen. Wenn ja, dann können Sie dieses Problem "Schlüssel nicht vorhanden" zu "Schlüssel vorhanden, aber Wert enthält kein angegebenes Element". –

Antwort

1

Ich denke, es gibt zwei Methoden, die verwendet werden können, Ihre Lösung zu verbessern:
1. setzen voraus, dass alle Schlüssel, die auf Anfrage sind in einem begrenzten Set. Vielleicht können Sie alle Schlüssel in den Satz legen, die nicht mit einem Wert wie "FALSE" existieren.
2. verbessern Sie Ihre leveldb Leistung. Passen Sie die Größe von Tabellencache und Blockgröße an oder verwenden Sie ssd als Speichermedium.
wir verwenden leveldb als persistenten KV-Speicher in der produktiven Umgebung und unterstützen Anwendungen wie Blacklist, die Ihrem Szenario ähnlich ist.

+0

Danke die Empfehlungen. Für die erste Lösung ist es unmöglich zu tun, weil unsere Schlüssel jeden Tag generiert werden (Schlüssel = Benutzer-ID + Datum), es ist unmöglich, alle Schlüssel falsch zu kennzeichnen. Für eine zweite Lösung kann Tabellencache nicht helfen, weil wir nicht aus dem Tabellencache finden können, müssen noch IO anfordern; die Blockgröße würde auch wenig helfen, weil bloom filter false positive da ist, Blockgröße erhöhen nur die Anzahl der Schlüssel erhöhen, was bedeutet, dass weniger Blöcke gefunden werden, aber meine Sorge ist, dass es irgendwelche Möglichkeiten gibt, IO Zugriff zu vermeiden. –

+0

Ich kann keine bessere Idee unter dieser Architektur herausfinden. In der Tat, wenn ich mit einem solchen Szenario konfrontiert bin, werde ich nur RAM-Cache-System verwenden, die einzelnen Fehler tolerieren und genügend Speicherplatz bieten kann. –