2017-02-13 2 views
0
for i, name in ipairs(redis.call('KEYS''cache:user_transaction_logs:*:8866666')) do redis.call('DEL', name); end" 

Wie kann ich diese redis Abfrage optimieren?Redis löschen nach Muster ist zu langsam

Wir Redis als Cache-Speicher in Rails.Whenever ausen verwenden macht eine erfolgreiche Transaktion Die Empfänger und Initiatoren Transaktionshistorie von redis abgelaufen ist

+0

gelöscht werden kann, eine kleine Optimierung kann mehrere Schlüssel in DEL senden, aber der größte Engpass hier ist KEYS Befehl. –

Antwort

5

Die Abfrage nicht optimiert werden kann - es sollte in seiner Gesamtheit ersetzt werden, da die Die Verwendung von KEYS wird für andere als Debugging-Zwecke in Nicht-Produktionsumgebungen empfohlen.

Ein bevorzugter Ansatz, anstatt zu versuchen, die relevanten Schlüsselnamen ad-hoc abzurufen, besteht darin, sie in einer Datenstruktur (z.B. Satz oder Liste) zu verwalten und davon zu lesen, wenn Sie die Löschungen durchführen.

1

Sie müssen den Ansatz ändern, wie Sie Cache-Einträge für Ihre Benutzer speichern. Ihre Schlüssel sollten so aussehen wie cache:user_transaction_logs:{user_id}. Dann können Sie den Eintrag einfach mit seinem Schlüssel (user_id) löschen.

Im Fall, wenn Sie mehrere Cache-Einträge pro User_id benötigen - verwenden Redis Hashes (https://redis.io/commands#hash) und dann wieder können Sie alle Einträge pro User_id mit HDEL mit einem Befehl DELETE oder benötigt Eintrag löschen.

Es ist auch eine gute Idee, die Redis-Datenbanknummern zu verwenden (Standard 0, 1-15 verfügbar) und separate Funktionen auf separate Datenbanknummern zu setzen. Dann für den Fall, wenn Sie Cache der gesamten Funktionalität, die mit einem Befehl FLUSHDB

Verwandte Themen