2016-04-20 12 views
1

Ich habe einige Produktdaten, die ich mehrere Versionen von in einem Redis-Cache speichern muss. Die Daten sind JSON-serialisiert. Der Prozess des Erlangens der einfachen (Basis-) Daten ist teuer, und der Prozess des Anpassens in verschiedene Versionen ist ebenfalls teuer, daher möchte ich alle Versionen zwischenspeichern, um sie wo immer möglich zu optimieren. Angenommen, die Anpassung basiert auf einem einzelnen Parameter und ich kann diesen Parameter als Teil des Cacheschlüssels verwenden.Speichern Sie mehrere Versionen von Daten in Redis-Cache

Der Prozess, den ich geplant hatte, zu verwenden, ist die Produktdaten abzurufen etwas wie folgt aus:

if cache contains appropriately customised data for this parameter 
    return customised data from cache 
else 
    if cache contains basic data 
     get basic data from cache 
    else 
     get basic data from primary data source (expensive) 
     save basic data to cache for next time 

apply customisations to basic data (expensive) 
save customised version to cache, using the parameter as a key 
return customised product 

Das alles funktioniert gut, aber ich versuche jetzt die beste Möglichkeit für unwirksam zu erklären, die Cache-Daten zu arbeiten, wenn Die zugrunde liegende Datenquelle ändert sich. Wenn sich die grundlegenden Produktinformationen ändern, müssen alle benutzerdefinierten Versionen ebenfalls abgelaufen sein. Ich werde benachrichtigt, wenn dies passieren muss.

Beachten Sie, dass die für die Anpassung des Produkts verwendeten Parameter nicht einfach aufzählbar sind. Es gibt eine große Anzahl von möglichen Parametern, so dass das Durchlaufen aller möglichen Schlüssel nicht durchführbar ist.

Redis scheint keine Möglichkeit zu bieten, mehrere Schlüssel mit einem Platzhalter ablaufen zu lassen, und nachdem ich mich bei Redis-Mustern umgesehen habe, bin ich nicht sicher, ob ich mich dem richtigen Weg nähere.

Gibt es eine bessere Möglichkeit, diese Art von angepassten, halbhierarchischen Daten in Redis zwischenzuspeichern, sodass sie abgelaufen sein kann?

+0

Sie können einen Hash verwenden, um alle Versionen der Daten/Dokumente des Produkts zu speichern. Um ungültig zu machen, löschen Sie einfach diesen Schlüssel (und alle darin gespeicherten Versionen sind auf einen Schlag verschwunden). –

+1

Danke! Genau das suche ich. Wenn Sie Ihren Kommentar zu einer Antwort machen, werde ich es akzeptieren. – John

Antwort

0

Redis 'Hash würde gut für Ihre Bedürfnisse funktionieren. Sie können die Version jedes Produkts als Wert eines Felds in einem Hash-Schlüssel für dieses Produkt speichern. Zum Beispiel:

HSET id:14 1 "{your JSON data v1}" 

Fetching eine Version ruft gerade HGET mit dem Schlüssel und entsprechendem Feld des Produkts. Um den gesamten Hash ungültig zu machen, DEL und/oder EXPIRE.

+0

Danke. Ich erkannte auch, dass das Szenario, das ich in dieser Frage skizziert habe, nur der erste Schritt ist - es gibt eine komplexere Situation, die ich in einer separaten Frage beschrieben habe (http://stackoverflow.com/questions/36743354/how-to-invalidate) - Teile einer Hierarchie-Baumstruktur von Daten im Redis-Cache. – John

Verwandte Themen