Für die Änderung von String verfügt Redis über: set, setex, append, incr, decr usw. Unter anderem wird durch die Verwendung von set und setex zum Ändern der ursprünglich vorhandenen Zeichenfolge die ursprünglich festgelegte Ablaufzeit zurückgesetzt. Streng genommen handelt es sich bei set und setex nicht um „Änderungen“, sondern um Überschreibungen, sodass der ursprünglich festgelegte Schlüsselwert festgelegt/gesetzt werden muss. Dieser Schlüssel wird den ursprünglichen Schlüssel überschreiben. Die Testergebnisse mit try redis lauten wie folgt:
Wenn Sie append, incr, decr und andere Befehle zum Ändern verwenden, wird die ursprüngliche Ablaufzeit nicht zurückgesetzt:
Also für die String-Struktur: Führen Sie einfach den Befehl set /setex aus, um die Ablaufzeit zurückzusetzen, und der Befehl set ändert die Ablaufzeit direkt so, dass sie nie abläuft.
Wenn ich beispielsweise einen {key1:value} auf 7:00 Uhr setze, beträgt die Ablaufzeit 30 Minuten, und wenn ich den Wert dieses Schlüssels zwischen 7:00 und 7:30 Uhr mehrmals setze/setze, beträgt die Ablaufzeit von key1 wird nicht um 7:30 Uhr zurückgesetzt. Wie kann sichergestellt werden, dass die Ablaufzeit nach dem Festlegen dieses Ablaufschlüssels nicht jedes Mal aktualisiert wird und der Ablauf um 7:30 Uhr stabil ist?
Methode 1:
Verwenden Sie Timer, erstellen Sie einen Timer, wenn Sie ihn zum ersten Mal einstellen, und löschen Sie den Schlüssel, wenn er abläuft. Diese Methode beansprucht bei großen Datenmengen mehr CPU-Ressourcen und wird nicht empfohlen.
Methode 2:
Jedes Mal, bevor Sie den Wert des Schlüssels festlegen, geben Sie die verbleibende Ablaufzeit des Schlüssels zu diesem Zeitpunkt zurück und weisen Sie dem Schlüssel die verbleibende Ablaufzeit als neue Ablaufzeit während Setex zu, was gelöst werden kann .
Am Beispiel des Spring-Projekts kann das Problem gelöst werden, indem der verbleibende Ablaufzeitstempel (Millisekundenebene) verwendet wird, der von der Methode redisTemplate.getExpire(String key) zurückgegeben wird. Im Wesentlichen wird ein PTTL-Befehl an redis gesendet, um den verbleibenden Zeitstempel zurückzugeben Ablauf des Schlüssels in Millisekunden.
Codebeispiel:
Lassen Sie Schlüssel1 bei jeder Änderung die Ablaufzeit behalten, als er zum ersten Mal festgelegt wurde.
//获取key1的剩余时间的时间戳 Long expire = redisTemplate.getExpire("key1"); //最后一个参数可以选秒、毫秒(TimeUnit.MILLISECONDS),Redis最多只能返回毫秒级别的key的剩余过期时间 redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
Der Gültigkeitszeitraum von K-V vom Typ String wird zurückgesetzt, wenn der Wertwert geändert wird:
Wenn ein K-V vorhanden ist, beträgt die Ablaufzeit 30 Sekunden. Wenn der Wertwert geändert wird, wird die Ablaufzeit auf zurückgesetzt 30 Sekunden, anstatt die verlorene Zeit von der ursprünglich eingestellten Zeit abzuziehen.
Mit Ausnahme der String-Datenstruktur wird durch Änderungen an anderen Datenstrukturen die Ablaufzeit nicht zurückgesetzt
Zum Beispiel Hash, Set, Zset, Liste usw.:
Nehmen Sie Hash als Beispiel:
Die Gültigkeitsdauer des Hash wird nicht zurückgesetzt. Die Zeitmessung wird neu gestartet, wenn der Hash-Feldwert geändert wird.
Wenn Sie die Zeit neu festlegen müssen, müssen Sie beim Ändern des Feldwerts den Gültigkeitszeitraum erneut angeben.
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Redis-Ablaufzeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!