Heim  >  Artikel  >  Datenbank  >  Was ist die Lösung für Java, Redis zu betreiben und den Ablauf am frühen Morgen des nächsten Tages festzulegen?

Was ist die Lösung für Java, Redis zu betreiben und den Ablauf am frühen Morgen des nächsten Tages festzulegen?

WBOY
WBOYnach vorne
2023-05-26 15:40:591290Durchsuche

Java Operation Redis-Einstellung läuft am frühen Morgen des nächsten Tages ab.

Szenario

Beim Abfragen von Daten stieß ich auf die Notwendigkeit, die Daten so einzustellen, dass sie am nächsten Tag ablaufen Tag in Redis Problem, aber Redis hat keine entsprechende API, also muss ich es selbst lösen

Idee

Berechnen Sie den Zeitunterschied zwischen dem frühen Morgen des nächsten Tag und die aktuelle Uhrzeit und stellen Sie den Zeitunterschied auf ein. Die Ablaufzeit von Redis kann den gewünschten Effekt erzielen ist grundsätzlich kein Problem.

Anbei ist die Redis-Toolklasse:

/**
     * 计算第二天凌晨与当前时间的时间差秒数
     * @param
     * @return java.lang.Long
     * @author shy
     * @date 2021/3/12 18:10
     */
    public static Long getNowToNextDaySeconds() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
    }

Einführung in die Redis-AblaufrichtlinienfunktionWenn wir Redis verwenden, Im Allgemeinen wird eine Ablaufzeit festgelegt, es gibt jedoch natürlich auch Fälle, in denen keine Ablaufzeit festgelegt ist, d. h. es läuft nie ab.

Wenn wir die Ablaufzeit festlegen, wie stellt Redis fest, ob sie abgelaufen ist und welche Strategie zum Löschen verwendet wird?

Ablaufzeit festlegen

Wenn wir den Schlüssel festlegen, können wir eine Ablaufzeit angeben, die beispielsweise die Ablaufzeit ist. Geben Sie an, dass dieser Schlüssel nur eine Zeit lang überleben kann Angenommen, Sie legen einen Schlüsselstapel fest, der eine Stunde lang überlebt. Wie löscht Redis den Schlüsselstapel nach der nächsten Stunde?

Die Antwort lautet: reguläres Löschen + verzögertes Löschen.

Das sogenannte reguläre Löschen bedeutet, dass Redis standardmäßig alle 100 ms zufällig einige Schlüssel mit einer festgelegten Ablaufzeit auswählt, prüft, ob sie abgelaufen sind, und sie löscht, wenn sie ablaufen. Bitte beachten Sie, dass das Durchlaufen aller Schlüssel mit Ablaufzeiten alle 100 ms zu einem erheblichen Leistungsabfall führt. Redis wählt tatsächlich alle 100 Millisekunden zufällig einige Schlüssel aus, um sie zu überprüfen und zu löschen.

Das Problem besteht jedoch darin, dass das regelmäßige Löschen dazu führen kann, dass viele abgelaufene Schlüssel nicht gelöscht werden, wenn die Zeit abgelaufen ist. Sie müssen sie also langsam löschen, das heißt, wenn Sie einen Schlüssel erhalten, redis prüft, ob dieser Schlüssel abgelaufen ist. Wenn die Ablaufzeit festgelegt ist, ist er abgelaufen? Wenn es abläuft, wird es gelöscht.

Durch die Kombination der beiden oben genannten Methoden wird garantiert, dass abgelaufene Schlüssel gelöscht werden. Alle abgelaufenen Schlüssel werden nicht automatisch gelöscht, wenn die Ablaufzeit erreicht ist, sodass die Speichernutzung nach Ablauf nicht reduziert wird.

Aber tatsächlich ist dies immer noch ein Problem, wenn beim regulären Löschen viele abgelaufene Schlüssel übersehen werden und sie dann nicht rechtzeitig überprüft werden und ein verzögertes Löschen durchgeführt wird, führt dies zu einer großen Anzahl Wie kann man mit dieser Situation umgehen?

Die Antwort lautet: Nutzen Sie den Gedächtniseliminierungsmechanismus.

Speichereliminierung

Wenn Redis zu viel Speicher beansprucht, wird zu diesem Zeitpunkt eine gewisse Eliminierung durchgeführt. Es gibt einige Strategien wie folgt:

#🎜🎜 ##🎜 🎜#

noeviction: Wenn der Speicher nicht ausreicht, um die neu geschriebenen Daten aufzunehmen, melden die neu geschriebenen Daten einen Fehler. Dieses tatsächliche Szenario wird im Allgemeinen nicht verwendet.

    allkeys-lru: Wenn der Speicher nicht ausreicht, um neu geschriebene Daten aufzunehmen, entfernen Sie im Schlüsselbereich den am wenigsten verwendeten Schlüssel ( Dies wird am häufigsten verwendet)
  • noeviction:当内存不足以容纳新写入数据时,新写入数据会报错,这个实际场景一般不会使用。

  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最少使用的key(这个是最常用的)

  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般用的比较少。

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。

  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

  • volatile-ttl

    allkeys-random: Wenn der Speicher nicht ausreicht, um die neu geschriebenen Daten im Schlüsselbereich aufzunehmen , random Entfernen Sie einen bestimmten Schlüssel, dieser wird im Allgemeinen weniger verwendet.

volatile-lru: Wenn der Speicher nicht ausreicht, um neu geschriebene Daten aufzunehmen, entfernen Sie The im Schlüsselbereich mit festgelegter Ablaufzeit zuletzt verwendeter Schlüssel. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#volatile-random: Wenn der Speicher nicht ausreicht, um neu geschriebene Daten aufzunehmen, erfolgt eine zufällige Bewegung im Schlüsselraum mit festgelegter Ablaufzeit Ziehen Sie einen Schlüssel ab. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#volatile-ttl: Wenn der Speicher nicht ausreicht, um neu geschriebene Daten aufzunehmen, gibt es im Schlüsselraum mit festgelegter Ablaufzeit solche Weitere Schlüssel mit früherem Ablaufdatum werden zuerst entfernt. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Speichereliminierung löst die Eliminierungsbedingung aus, um bestimmte Schlüssel zu löschen. Dies ist auch der Grund, warum die Schlüssel verloren gehen, ohne dass die Ablaufzeit festgelegt wird. #🎜🎜#

Das obige ist der detaillierte Inhalt vonWas ist die Lösung für Java, Redis zu betreiben und den Ablauf am frühen Morgen des nächsten Tages festzulegen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen