Heim  >  Artikel  >  Datenbank  >  Einstellung der Redis-Überlebenszeit

Einstellung der Redis-Überlebenszeit

尚
nach vorne
2020-03-26 09:41:553918Durchsuche

Einstellung der Redis-Überlebenszeit

Redis bietet eine Überlebenszeit für Schlüssel. Wenn die Überlebenszeit nicht angegeben ist, ist die Überlebenszeit dauerhaft. Redis löscht diesen Schlüssel nach Ablauf der Zeit automatisch. Sie können den Befehl EXPIRE verwenden. Die Zeiteinheit ist Sekunden. Wenn eine Taste auf eine begrenzte Überlebenszeit eingestellt ist, wird sie wieder auf permanent gesetzt, wenn die SET-Taste neu zugewiesen wird:

SET session:captcha sd2a
EXPIRE session:captcha 600

Abbrechen der Überlebenszeit und ändern Sie die Lebensdauer des Schlüssels auf permanent, also PERSIST:

PERSIST session:captcha

Verwenden Sie den TTL-Befehl, um die Lebensdauer eines Schlüssels zu überprüfen. -1 bedeutet dauerhaft oder nach Ablauf gelöscht.

TTL session:captcha

Die Überlebenszeit wird während der Redis-Befehle INCR, LPUSH, HSET, ZREM und anderer Befehle nicht geändert.

(Empfohlen: Redis-Video-Tutorial)

Wenn Sie die Zeit millimetergenau steuern möchten, benötigen Sie PEXPIRE und verwenden PTTL, um die verbleibende Zeit zu überprüfen.

Was ist, wenn Sie eine Ablaufzeit angeben möchten, anstatt wie viele Sekunden es ablaufen soll? Sie benötigen EXPIREAT und PEXPIREAT. Der Parameter von EXPIREAT ist der Zeitstempel des Ablaufs (Sekunden) und der Parameter von PEXPIREAT ist die Ablaufzeit des Zeitstempels (Millisekunden)

SET session:captcha sd2a
EXPIREAT session:captcha 1399902009
PEXPIREAT session:captcha 1399902009000

Anwendungsszenario 1: Zugriffshäufigkeitsbegrenzung: Wir beschränken jeden Benutzer auf nur 1 Minute Kann 10 Seiten durchsuchen. Der Pseudocode lautet wie folgt:

$isExists = EXISTS limit:user1:192.168.1.2
if($isExists){
    $num = INCR limit:user1:192.168.1.2
    if($num > 10){
        print '超过限制'
        exit
    }
}else{
    MULTI
    INCR limit:user1:192.168.1.2
    EXPIRE limit:user1:192.168.1.2 60
    EXEC
}

Der Grund, warum wir Transaktionen verwenden, liegt darin, dass der Client nach der Ausführung von INCR limit:user1:192.168.1.2 und vor der Ausführung von EXPIRE limit:user1:192.168.1.2 60 hinzugefügt wird . Dann werden der Schlüssel und der Wert beibehalten. Und auf diese ID kann nur 10 Mal im Leben zugegriffen werden. Das ist schade.

Anwendungsszenario 2: Caching implementieren. Die Berechnung der Rankings von 10.000 Benutzern ist sehr ressourcenintensiv, daher speichern wir die Daten nach der ersten Berechnung in einem Schlüssel und legen dann die Überlebenszeit für diesen Schlüssel fest. Nach einer Stunde läuft die Überlebenszeit ab, der Schlüssel wird gelöscht, es wird erneut ein neues Ranking berechnet und ein temporärer Schlüssel gespeichert. Wir verwenden Pseudocode zur Implementierung:

//战斗排行榜
$rank = GET cache:rank:fight
if not $rank
    $rank = 计算排名()
    MULTI
    SET cache:rank:fight $rank
    EXPIRE cache:rank:fight 3600
    EXEC

Redis ist eine im Speicher gespeicherte Datenbank. Wenn der Speicher voll ist, löscht Redis einen bestimmten Cache basierend auf der Konfigurationsdatei. Das Konfigurationselement ist der Parameter maxmemory in der Redis-Konfigurationsdatei und die Einheit ist Bytes. Nachdem dieser Grenzwert überschritten wurde, werden unnötige Schlüssel gemäß dem Parameter maxmemory-policy in der Konfigurationsdatei gelöscht. Die optionalen Regeln von maxmemory-policy sind die folgenden vier:

1. volatile-lru: Verwenden Sie den LRU-Algorithmus, um einen Schlüssel (einen Schlüssel mit festgelegter Überlebenszeit) zu löschen.

2. allkey-lru: Verwenden Sie den LRU-Algorithmus, um einen Schlüssel zu löschen.

3. Volatil-zufällig: Einen Schlüssel sofort löschen (Schlüssel mit festgelegter Lebensdauer).

4. allkey-random: Einen Schlüssel sofort löschen.

5. volatile-ttl: Löschen Sie einen Schlüssel, dessen Lebensdauer bald abläuft. Es besteht darin, N Schlüssel auf einmal herauszunehmen und dann die Schlüssel unter den N Schlüsseln zu löschen, die bald ablaufen, anstatt alle Schlüssel zu durchlaufen, um die Schlüssel zu löschen, die bald ablaufen. Was ist N? Konfigurationsdatei.

6. Fehler: Nicht löschen, Fehler zurückgeben.

Redis legt die Ablaufzeit des Schlüssels fest – EXPIRE-Befehl

EXPIRE key seconds

legt die Überlebenszeit für den angegebenen Schlüssel fest. Wenn der Schlüssel abläuft (die Überlebenszeit ist 0), wird er automatisch gelöscht .

In Redis werden Schlüssel mit Überlebenszeit als „volatil“ bezeichnet.

Die Lebensdauer kann durch Löschen des gesamten Schlüssels mit dem DEL-Befehl entfernt oder mit den Befehlen SET und GETSET überschrieben werden. Dies bedeutet, dass ein Befehl nur einen Schlüssel mit einer Lebensdauer ändert (ändern), wenn der Wert von Wird der Schlüssel durch einen neuen Schlüsselwert ersetzt, wird die Lebensdauer nicht geändert.

Wenn Sie beispielsweise den INCR-Befehl für einen Schlüssel ausführen, den LPUSH-Befehl für eine Liste ausführen oder den HSET-Befehl für eine Hash-Tabelle ausführen, ändern diese Vorgänge nicht die Überlebenszeit des Schlüssels selbst.

Wenn Sie andererseits RENAME verwenden, um einen Schlüssel umzubenennen, ist die Überlebenszeit des umbenannten Schlüssels dieselbe wie vor der Umbenennung.

Eine weitere Möglichkeit des RENAME-Befehls besteht darin, zu versuchen, einen Schlüssel mit einer Lebensdauer in einen anderen_Schlüssel mit einer Lebensdauer umzubenennen. In diesem Fall wird der alte another_key (und seine Lebensdauer) gelöscht und dann der alte Schlüssel umbenannt werden, daher ist die Überlebenszeit des neuen another_key dieselbe wie die des ursprünglichen Schlüssels.

Verwenden Sie den Befehl PERSIST, um die Lebensdauer des Schlüssels zu entfernen, ohne den Schlüssel zu löschen, wodurch der Schlüssel wieder zu einem „persistenten“ Schlüssel wird.

Überlebenszeit aktualisieren

Sie können den EXPIRE-Befehl auf einem Schlüssel ausführen, der bereits eine Überlebenszeit hat, und die neu angegebene Überlebenszeit ersetzt die alte Überlebenszeit.

Genauigkeit der Ablaufzeit

In der Redis 2.4-Version liegt die Verzögerung der Ablaufzeit innerhalb von 1 Sekunde – das heißt, selbst wenn der Schlüssel abgelaufen ist. Aber es kann sein Innerhalb einer Sekunde nach Ablauf kann weiterhin darauf zugegriffen werden, und in der neuen Redis 2.6-Version wird die Verzögerung auf weniger als 1 Millisekunde reduziert.

Unterschiede vor Redis 2.1.3

In Versionen vor Redis 2.1.3 führt das Ändern eines Schlüssels mit einer Überlebenszeit dazu, dass der gesamte Schlüssel gelöscht wird, dieses Verhalten Dies war auf Einschränkungen der damaligen Replikationsebene zurückzuführen und diese Einschränkung wurde nun behoben. Verfügbare Versionen:

>= 1.0.0

Zeitkomplexität:

O(1)

Rückgabewert:

设置成功返回 1 。

当 key 不存在或者不能为 key 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的生存时间),返回 0 。

redis> SET cache_page "www.google.com"
OK

redis> EXPIRE cache_page 30  # 设置过期时间为 30 秒
(integer) 1

redis> TTL cache_page    # 查看剩余生存时间
(integer) 23

redis> EXPIRE cache_page 30000   # 更新过期时间
(integer) 1

redis> TTL cache_page
(integer) 29996

1、在小于2.1.3的redis版本里,只能对key设置一次expire。redis2.1.3和之后的版本里,可以多次对key使用expire命令,更新key的expire time。

2、redis术语里面,把设置了expire time的key 叫做:volatile keys。 意思就是不稳定的key。

3、如果对key使用set或del命令,那么也会移除expire time。尤其是set命令,这个在编写程序的时候需要注意一下。

4、redis2.1.3之前的老版本里,如果对volatile keys 做相关写入操作(LPUSH,LSET),和其他一些触发修改value的操作时,redis会删除 该key。

也就是说 :

redis.expire(key,expiration);

redis.lpush(key,field,value);

redis.get(key) //return null

redis2.1.3之后的版本里面没有这个约束,可以任意修改。

redis.set(key,100);
redis.expire(key,expiration);
redis.incr(key)
redis.get(key)
//redis2.2.2 return 101; redis<2.1.3 return 1;

5、redis对过期键采用了lazy expiration:在访问key的时候判定key是否过期,如果过期,则进行过期处理。其次,每秒对volatile keys 进行抽样测试,如果有过期键,那么对所有过期key进行处理。

更多redis知识请关注redis入门教程栏目。

Das obige ist der detaillierte Inhalt vonEinstellung der Redis-Überlebenszeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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