Node-redis: So stellen Sie die Ablaufzeit ein

Erstellt am 7. März 2016  ·  40Kommentare  ·  Quelle: NodeRedis/node-redis

client.set(key, value)

wie man eine Ablaufzeit einstellt

question

Hilfreichster Kommentar

@BridgeAR : Verstanden, aber du verpasst irgendwie den Punkt. Vielleicht bin ich nur faul, aber ich weigere mich, die gesamte native Redis-API zu lernen, nur damit ich Dinge hineinstecken und herausziehen kann. Vielleicht sollte ich dann nicht die node_redis Bibliothek benutzen. Vielleicht sollte ich etwas anderes verwenden, das darauf sitzt und dies von mir weg abstrahiert. Wie ich bereits sagte, verwenden die meisten Leute Redis als Cache, und in der Dokumentation zu node_redis ist nichts enthalten, das sogar das Wort "expire" oder "expiration" (oder sogar den Befehl "EX" oder "EX" erwähnt) TTLs) Ohne in die offizielle Redis-Dokumentation einzusteigen, ist es schwer zu verstehen, wie man tatsächlich eine TTL für einen Schlüssel festlegt, eine Aktion, die meiner Meinung nach die Mehrheit der Leute tun muss.

Alle 40 Kommentare

Bitte überprüfen Sie die Befehle Dokumentation . Jeder Teil hat seinen eigenen Parameter, so dass Sie etwas schreiben würden wie:

client.set(key, value, 'EX', 60 * 60 * 24, callback);

Vielen Dank

@BridgeAR der Dokumentationslink funktioniert nicht

es funktioniert nicht .. redis version 3.0

client.set(key, value, 'EX', 60 * 60 * 24, callback);

@sxyjijiji es funktioniert perfekt für mich. Wenn Sie auf einen Fehler stoßen, veröffentlichen Sie bitte Ihren Stack-Trace und beschreiben Sie, was nicht funktioniert.

@brucejcw Ich habe den Link

Ich denke, es ist nicht in der Node_redis-Dokumentation enthalten, auch nicht in der Set-Funktion.
Vielleicht verwirrt es einige Leute.

@bruceCzK Es gibt keine explizite

Es gibt jedoch mehr als einen Verweis auf die Hauptdokumentation, den Sie immer lesen sollten, um zu sehen, wie die Befehle funktionieren. Wenn Sie die Möglichkeit sehen, die aktuelle Dokumentation zu verbessern, können Sie eine Pull-Anfrage dafür öffnen. Es ist möglicherweise eine gute Idee, den Link zu allen "Befehlen" in der README.md hinzuzufügen.

Hey Leute, gibt es eine Möglichkeit, den Standardablauf auf Client-Ebene festzulegen?

Bsp.: So etwas wie

  const redisClient = redis.createClient({
    host: process.env.REDIS_ENDPOINT,
    port: process.env.REDIS_PORT,
    expire: 60 
})

Ich spreche nur davon, dass dies eine sehr verwirrende Syntax ist, insbesondere für Neulinge. In der Dokumentation zu node_redis ist nichts über Schlüsselablaufzeiten / TTLs enthalten. Ich würde mir vorstellen, dass die meisten Leute Redis als Teil einer Caching-Ebene verwenden und die Ablaufzeit für Schlüssel ein wirklich wichtiger Teil dieses Workflows ist. IMO, dies sollte entweder in die Basis-API integriert werden (möglicherweise kann die Funktion set einen optionalen Parameter aufnehmen) oder die Dokumentation sollte zumindest über die Befehls-API sprechen, die sich auf den Schlüsselablauf bezieht.

Es sieht so aus, als ob die Antwort Nein lautet, dass wir auf Clientebene keinen globalen Ablauf festlegen können. Es ist eine Art Scheiße, auf jeden einzelnen Schlüssel ablaufen zu müssen.

@ryanvanderpol Die Funktion set akzeptiert bereits einen optionalen Parameter wie beschrieben. Schauen Sie sich einfach die Dokumentation und meinen Kommentar oben an.

@ kienpham2000 Auf Client-Ebene gibt es kein globales
Dies ist keine Caching-Bibliothek, und wahrscheinlich suchen Sie stattdessen danach.

@BridgeAR : Verstanden, aber du verpasst irgendwie den Punkt. Vielleicht bin ich nur faul, aber ich weigere mich, die gesamte native Redis-API zu lernen, nur damit ich Dinge hineinstecken und herausziehen kann. Vielleicht sollte ich dann nicht die node_redis Bibliothek benutzen. Vielleicht sollte ich etwas anderes verwenden, das darauf sitzt und dies von mir weg abstrahiert. Wie ich bereits sagte, verwenden die meisten Leute Redis als Cache, und in der Dokumentation zu node_redis ist nichts enthalten, das sogar das Wort "expire" oder "expiration" (oder sogar den Befehl "EX" oder "EX" erwähnt) TTLs) Ohne in die offizielle Redis-Dokumentation einzusteigen, ist es schwer zu verstehen, wie man tatsächlich eine TTL für einen Schlüssel festlegt, eine Aktion, die meiner Meinung nach die Mehrheit der Leute tun muss.

@ryanvanderpol Es ist eine Redis-Client-Bibliothek, keine Cache-Bibliothek. Wenn Sie eine Redis-Bibliothek verwenden, wird von Ihnen erwartet, dass Sie die Redis-Dokumentation lesen, insbesondere weil node_redis aus diesem Grund nicht dokumentiert, wie die Befehle funktionieren. Schließlich leitet node_redis die Parameter die meiste Zeit nur an Redis weiter.

Wenn Sie eine Cache-Bibliothek wünschen, können Sie eines der vielen npm-Pakete verwenden, wie z. B. Cacheman-Redis oder Node-Redis-Cache . In der Dokumentation wird explizit "expire" erwähnt: smile:

Ich verstehe Ihren Standpunkt, aber ich denke, es sollte nicht die Aufgabe von node_redis sein, die Dokumentation von Redis zu duplizieren oder Dinge mehr als nötig zu abstrahieren ...

@CherryDT Ihr Punkt ist fair, weshalb ich meinem vorherigen Kommentar auch "Vielleicht sollte ich etwas anderes verwenden, das über node_redis liegt" vorangestellt habe, aber angesichts der Anzahl der +1, die mein Kommentar bisher erhalten hat, habe ich keinen Zweifel dass ich mit dieser Frustration nicht allein bin.

Wenn ich nur direkt mit Redis in einem Rohformat kommunizieren wollte, bietet dieser Wrapper für mich nicht wirklich viel Wert. Ich denke, es ist völlig fair anzunehmen, dass die überwiegende Mehrheit der Leute, die Redis verwenden, dies für Caching-Zwecke tun und sich um Ablaufzeiten kümmern.

Diese ganze Konversation hätte einfach mit einem "guten Punkt, wir sollten der Dokumentation über das Festlegen von Schlüsselabläufen zusammen mit einigen anderen häufig verwendeten Befehlen etwas hinzufügen" negiert werden. Ich nehme an, ich könnte auch eine PR dafür einreichen, aber ich kenne Redis nicht, außer es als Cache zu verwenden.

Das heißt, ich werde mir die anderen Bibliotheken ansehen, die Sie erwähnt haben, und ich könnte stattdessen zu einer dieser Bibliotheken wechseln, wenn sie besser zu meinem Anwendungsfall passen.

Mein Punkt ist, dass es viel mehr Funktionen als TTLs gibt. Es gibt verschiedene Datentypen (Listen, Sätze, sortierte Sätze), ein Herausgeber- und Abonnentensystem und mehr, und im Grunde genommen wird die Dokumentation von Redis dupliziert (und aktualisiert) oder es wird mehr Zucker zu den Parametern hinzugefügt (und sie werden aktualisiert) Dinge, von denen ich glaube, dass sie außerhalb des Bereichs dieses Kunden liegen. Ich würde von einem MySQL-Client auch nicht die Funktionen eines ORM (oder einer MySQL-Referenz) erwarten, oder?

Ich glaube an modularen Aufbau und daher glaube ich auch, dass die einzelnen Module nicht größer sein sollten, als sie sein müssen. In diesem Fall leistet dieser Client hervorragende Arbeit bei der Zusammenfassung des Netzwerkteils und der Bereitstellung der Befehle als Methoden für eine erste Ebene der Benutzerfreundlichkeit. Ich denke jedoch, dass darüber hinaus die Aufgabe spezialisierterer Bibliotheken für die spezifischen Ziele sein sollte (wie die, die ich zuvor für den Cache verlinkt habe, oder andere für Pubsub usw.). Diese verwenden node_redis übrigens häufig intern. Auch wenn es für Sie direkt nicht von großem Nutzen ist, kann es indirekt sein, da die abstrakteren Bibliotheken, die Sie möglicherweise verwenden, node_redis möglicherweise als Abhängigkeit verwenden.

Daher stimme ich zu, dass Sie für Ihren Anwendungsfall besser dran wären, wenn Sie eine Bibliothek auf "höherer Ebene" über so etwas wie "node_redis" hätten.

Ja, ich stimme dir hier überhaupt nicht zu. Ich würde erwarten, dass die Dokumentation für einen MySQL-Client mir zeigt, wie man einige der allgemeinen Dinge macht, die jeder in MySQL macht, wie man eine Auswahl mit einer Aggregatfunktion macht oder wie man eine Unterabfrage macht. Ich erwarte nicht, dass es erklärt, wie man ein ORM erstellt oder eine Reproduktion der gesamten MySQL-Dokumentation ist, aber ich zeige mir, wie ich allgemeine Dinge mit der Bibliothek mache.

Wie auch immer, klar, Sie werden meinen Standpunkt nicht sehen und das ist Zeitverschwendung. Bisher stimmen 17 Personen mir zu und nur Sie und eine andere Person sind anderer Meinung. Vielleicht sollten Sie einen Schritt zurücktreten und darüber nachdenken, wie Sie ab und zu Dinge aus der Perspektive anderer Menschen sehen können.

Warum machst du das persönlich? Ich verstehe Ihren Standpunkt vollkommen, ich denke nur, dass node_redis dann nicht das richtige Werkzeug für den Job ist. (Wie Sie selbst vereinbart haben, bevor ich überhaupt angefangen habe, meinen Standpunkt darzulegen.) Denken Sie darüber nach, wenn Sie die Dinge klein und in sich geschlossen halten, werden viele Dinge vereinfacht. node_redis macht sich Sorgen um das Netzwerk, Dinge wie node-cache-redis (oder Ihre eigene Implementierung) sorgen sich um die korrekte Verwendung der Redis-API. Auf diese Weise gibt es nicht so viele Abhängigkeiten. Bibliotheken "oben" sind immer auf die eine oder andere Weise vorhanden, und auf diese Weise muss node_redis nicht jedes Mal aktualisiert werden (oder sogar verschiedene API-Versionen unterstützen), wenn Redis eine Funktion hinzufügt oder ändert (nur wenn ein ganzer Befehl hinzugefügt wird). .

Ich habe Ihnen alternative Lösungen angeboten, und ich hoffe, dass diese Ihre Anforderungen erfüllen. Wenn nicht, nehmen Sie sich einen Moment Zeit, um auf npm nach "redis" zu suchen, und Sie werden auch Tonnen anderer Bibliotheken finden.

Lassen Sie uns einfach zustimmen, dass wir uns darin nicht einig sind. (Und es spielt keine Rolle, ob 17 oder 1700 Menschen Ihnen oder mir zustimmen. Ich denke, jede Meinung sollte geschätzt werden.)

Wenn wir uns die ursprüngliche Frage und die Antwort ansehen, wusste ich nicht, dass ich .set() mit 'EX' und solchen Zeitoptionen in dieser Bibliothek verwenden muss.

In der aktuellen README.md wird erklärt, wie client.hgetall (https://github.com/NodeRedis/node_redis#clienthgetallhash-callback) verwendet wird. Vielleicht können wir in einigen weiteren Fällen für SET und GET hinzufügen in ähnlicher Weise? Ich gehe auch davon aus, dass die Leute viel GET und SET mit Redis verwenden.

Mir war nicht bewusst, dass so viele Leute Probleme damit hatten, da die Likes nicht in meinem Posteingang auftauchen.

Ich wäre bereit für eine PR, die den Befehl set als Beispiel dokumentiert und gleichzeitig "expire" erwähnt.

Ich hätte auch gerne eine PR, die dokumentiert, dass dies keine Cache-Bibliothek ist und dass es keine sein soll. Ich bin offen für Beiträge, wie die Dokumentation für neue Leute verbessert werden kann.

@ kienpham2000 Nun, es ist auch ein separater Befehl - setex :)

Nur um hier die Erklärung von _redis_ in der Readme-Datei des _node_redis_-Moduls zu erläutern. Die Idee hat mich nicht ganz überzeugt. Wie in diesem Beispiel dargestellt - Verwenden von set und expire in einem multi / exec , Verwenden von setex oder Verwenden von set mit 'ex' - es gibt unzählige Möglichkeiten, viele Dinge zu tun. Nichts davon hat etwas mit Knoten zu tun. Wir erklären hgetall weil es davon abweicht, wie andere Befehle Werte zurückgeben.

Um nicht zu sagen, dass die Leute keine Fragen haben, aber es scheint mir, dass das Schreiben eines Blogs oder eines mittleren Posts oder so etwas eine bessere Möglichkeit ist, die Leute zu informieren, als es hier zu konzentrieren. Wenn wir die Frage bekommen, kann sie nur mit allen auftretenden Problemen verknüpft werden. Das Verwandeln der Readme-Datei des _node_redis_-Moduls in die Quelle für Wissen ist möglicherweise nicht möglich.

@stockholmux Ich bin nur neugierig, wie wir Setex in dieser Bibliothek verwenden? Ist es nur client.setex() ?

Wenn es sich bei dieser Bibliothek um eine 1-1-Zuordnung mit Redis-Befehlen handelt, benötigen wir meines Erachtens kein Dokument. Aber wenn diese Bibliothek eine spezielle API- oder Diff-Methode zum Übergeben von Optionen hat, wäre es für Entwickler sehr hilfreich, eine Art API-Dokument zu haben.

@ kienpham2000 es ist eine 1-zu-1-Zuordnung. Es sollte immer eins sein. Ein einfacher Client zur Verwendung der API. Dies ist ein niedriges Niveau, kein hohes Niveau.

Und @stockholmux hat Recht, dass hgetall nur dokumentiert ist, weil Sie es auf mehr Arten als jeden anderen Befehl verwenden können. Aber es ist immer noch eine 1-zu-1-Zuordnung.

Wie auch immer: Ich bin dafür, einen Abschnitt darüber hinzuzufügen, damit dieser nicht wieder auftaucht.

@BridgeAR cool, danke, dass bist , diese PR zu akzeptieren. Hier ist mein https://github.com/NodeRedis/node_redis/pull/1229/files

Jetzt habe ich das gefunden und es sieht aus wie eine andere Methode: https://dzone.com/articles/tutorial-working-nodejs-and

Ich konnte diese Methode auch nicht zum Laufen bringen (kein Fehler, nur keine Auswirkung, also gebe ich dieses Projekt auf und wechsle zu https://www.npmjs.com/package/node-cache, das Redis sowieso verwenden kann.

Unter Windows ist es nicht möglich, den Ablauf innerhalb der "set" -Methode mit 'EX', 20 festzulegen, da nur 2 Parameter anstelle von o 3 akzeptiert werden.

Vielleicht haben Sie eine alte Redis-Version? Die Dokumente sagen, dass es in Redis 2.6.12 hinzugefügt wurde: https://redis.io/commands/set

Sie können stattdessen SETEX verwenden, das seit 2.0.0 existiert ...

Vielleicht haben Sie eine alte Redis-Version? Die Dokumente sagen, dass es in Redis 2.6.12 hinzugefügt wurde: https://redis.io/commands/set

Ich verwende Redis in einem Node-Express-Projekt, mit JS ist es nicht möglich, drei Parameter hinzuzufügen (oder ich bin nicht in der Lage .. :-()

redis.set("cache:" + req.originalUrl, JSON.stringify(result), 'EX', 25); -> Dies ist mein Code mit Fehler im Ablaufbereich.

Welche Redis-Version?

Redis 2.4.5 für Windows Redis-Windows und die neueste Version des Knotenmoduls.

Dann ist es klar, bitte lesen Sie die Nachricht oben noch einmal und überprüfen Sie die Redis-Dokumentation! Der "EX" -Parameter in SET wurde erst in 2.6.12 hinzugefügt, sodass Ihre Redis-Version 2.4.5 ihn nicht hat. Sie können jedoch stattdessen SETEX verwenden, das seit 2.0.0 vorhanden ist.

redis.setex(key, seconds, value)
redis.setex(key, value, seconds)

redis.setex(key, value, expiration) -> das funktioniert nicht

... aber ich habe in diesem Link einen richtigen Weg gefunden: redis windows

Wenn Sie Ihre Redis-Version ändern möchten, ist Ihr Weg natürlich richtig.
Wenn nicht, funktioniert auch meine, ich habe gerade die Parameter falsch verstanden (aber wenn Sie die SETEX-Dokumente überprüft hätten, hätten Sie es bemerkt): Es ist Schlüssel, Sekunden, Wert und nicht Schlüssel, Werte, Sekunden.

Wie auch immer, schön zu hören, dass es jetzt für Sie funktioniert.

Das Folgende funktioniert nicht.

client.set('key', 'value', 'EX', 10, (error, replay)=>{
...
}

Irgendwelche Updates dazu?
Ich benutze momentan client.expire(id,10) .

PS: Ich verwende die Redis-Version: Redis server v=5.0.0 und die Knotenversion: v8.10.0

@kdthanvi Das sollte funktionieren. Überprüfen Sie, was tatsächlich passiert, indem Sie MONITOR von redis-cli wenn Sie es ausführen.

@ kdthanvi ist richtig. Es funktioniert nicht mit Redis 5:

client.set(key, value, 'EX', 60 * 60 * 24, callback);

Du brauchst:

`
client.set (Schlüssel, Wert, Rückruf);

client.expire (Schlüssel, TTL, Rückruf);
`

damit es tatsächlich funktioniert.

@martinlevesque Ich glaube, Sie irren sich. EX wurde in 2.6.12 hinzugefügt und node_redis übergibt 'EX' unabhängig von der Version korrekt. Überprüfen Sie mit MONITOR und Sie werden sehen.

SET + EXPIRE kann aufgrund atomarer Unterschiede gefährlich anders sein als SET .. EX .

Da dieser Thread die Nummer 1 ist, wenn ich nach "Redis Node Set Expire" suche, möchte ich darauf hinweisen, dass der Befehl "Follow Set Expire" ab heute mit NodeJS Redis funktioniert.

setex(key, 60, value)

Wobei 60 die Ablaufzeit in Sekunden ist.

Da dieser Thread die Nummer 1 ist, wenn ich nach "Redis Node Set Expire" suche, möchte ich darauf hinweisen, dass der Befehl "Follow Set Expire" ab heute mit NodeJS Redis funktioniert.

setex(key, 60, value)

Wobei 60 die Ablaufzeit in Sekunden ist.

Fand dies nach 2 Stunden Debugging und Fehlerbehebung. Ich danke dir sehr ;)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen