Im CacheBuilder auf alten Wert zugreifen?

  • Hallo,

    kann ich in CacheBuilder::rebuild irgendwie auf den alten Wert zugreifen, bevor ich den neuen zurückgebe?

    Hintergrund: Ich mache ein API-Request im CacheBuilder. Falls dieser fehlschlägt (Rate-Limiting etc.), will ich einfach den alten Wert erneut in den Cache schreiben und zurückgeben, bis der Cache das nächste mal aktualisiert wird.


    Grüße

    • Offizieller Beitrag

    Das Framework sollte AbstractCacheBuilder::rebuild einfach als zusätzlichen Parameter noch den alten Wert mitliefern.

    Nein, denn dein gewünschtes Verhalten stellt einen Design-Fehler dar. Der von SoftCreatR im Übrigen auch.

    Cache-Builder sind per Definition idempotent und das einzige, dass vom Core garantiert wird ist, dass der Cache nach Erreichen eines maximalen Alters zurückgesetzt wird. Zu keinem Zeitpunkt wird dir garantiert, dass der Cache existiert oder jemals existiert hat.

    Wenn die Daten, etwa auf Grund eines Rate-Limiting, zu mindestens zeitweise garantiert vorgehalten werden sollen, dann speichere diese sauber ab. Nutze dafür eine Datenbank-Tabelle oder (falls dafür geeignet) den wcf\system\registry\RegistryHandler, um für dein Paket persistent Daten zu hinterlegen.

  • Der von SoftCreatR im Übrigen auch.

    Das ist noch ein Überbleibsel aus WCF 2-Zeiten :P Hat bisher aber problemlos funktioniert:

    Klar, wenn der erste noch nie Daten zurückgegeben hat, gibt der zweite auch nichts zurück. Aber wenn der erste mal was zurückgegeben hat, gibt der zweite definitiv etwas zurück (außer, der Cache wird geleert und man hat wieder den Status-Quo).

    Für den RegistryHandler wäre eine Doku ggf. ganz nützlich.

  • Hallo,

    der RegistryHandler war mir auch neu. Sowas habe ich schon länger gesucht. Danke für den Tipp Alex.

    Für den RegistryHandler wäre eine Doku ggf. ganz nützlich.

    Ist eigentlich ziemlich einfach, wenn ich das richtig sehe:

    PHP
    // key speichern
    RegistryHandler::getInstance()->set('my.package.name', 'key', 'val');
    
    // key abrufen
    RegistryHandler::getInstance()->get('my.package.name', 'key');
    
    // key löschen
    RegistryHandler::getInstance()->delete('my.package.name', 'key');

    Gespeichert werden die Daten in der Tabelle wcf1_registry.

    • Offizieller Beitrag

    Frage wäre halt, für welche Form von Informationen das gedacht ist, also ob es beispielsweise Sinn macht, ganze API responses darin zu speichern. Und für wie lange, etc.

    Die Daten bleiben dort bis zur Ewigkeit bestehen, diese werden nicht automatisiert entfernt. Der Wert wird in MySQL durch ein MEDIUMTEXT repräsentiert.

    Ich gebe zu bedenken, dass die Registry die Werte pro Paket abfragt und somit nicht für umfangreiche Datenmengen geeignet ist, bei denen immer nur eine kleine Teilmenge benötigt wird. Für so etwas eignet sich eine eigene Datenbank-Tabelle deutlich besser.

    Die Registry ist dafür gedacht, "lose" Daten vorzuhalten, die persistent gespeichert werden sollen, eine eigene Datenbank-Tabelle aber zu viel wäre. Im konkreten Fall kann man diese also auch verwenden, um die jeweils letzte, erfolgreiche API-Response darüber zu cachen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!