ホームページ >データベース >Redis >Redis の生存時間の設定

Redis の生存時間の設定

尚
転載
2020-03-26 09:41:553956ブラウズ

Redis の生存時間の設定

Redis はキーの生存時間を提供します。生存時間が指定されていない場合、生存時間は永続的になります。 Redis は、時間が経過するとこのキーを自動的に削除します。 EXPIRE コマンドを使用できます。時間の単位は秒です。キーの生存時間が制限されている場合、SET キーが再割り当てされると、キーは再び永続的に設定されます:

SET session:captcha sd2a
EXPIRE session:captcha 600

生存期間をキャンセルするキーの有効期間が永続に設定されており、これは PERSIST:

PERSIST session:captcha

TTL コマンドを使用してキーの有効期間を表示します。-1 は永続、または有効期限が切れると削除されることを意味します。

TTL session:captcha

Redis の INCR、LPUSH、HSET、ZREM およびその他のコマンドでは、生存時間は変更されません。

(推奨: redis ビデオ チュートリアル )

時間をミリ単位で正確に管理したい場合は、PEXPIRE が必要で、残り時間を確認するには PTTL を使用します。

有効期限が切れる秒数ではなく、有効期限を指定したい場合はどうすればよいでしょうか? EXPIREAT と PEXPIREAT が必要です。 EXPIREAT のパラメータは有効期限のタイムスタンプ (秒)、PEXPIREAT のパラメータはタイムスタンプの有効期限 (ミリ秒) です。

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

アプリケーション シナリオ 1: アクセス頻度制限: 各ユーザーを 1 分に制限します。 10ページを閲覧します。疑似コードは次のとおりです。

$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
}

トランザクションを使用する理由は、INCR limit:user1:192.168.1.2 を実行した後、EXPIRE limit:user1:192.168.1.2 60 を実行する前に、クライアントがクローズとして追加されるためです。その後、キーと値は永続化されます。そして、このIDは一生に10回しかアクセスできません。それは残念です。

アプリケーション シナリオ 2: キャッシュを実装します。 10,000 ユーザーのランキングの計算は非常にリソースを消費するため、最初の計算後にデータをキーに保存し、このキーの生存時間を設定します。 1 時間後に生存時間が経過するとキーが削除され、新しいランキングが再度計算されて一時キーが保存されます。

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

Redis はメモリに保存されたデータベースです。メモリがキャッシュでいっぱいの場合、Redis は構成ファイルに基づいて特定のキャッシュを削除します。設定項目はRedis設定ファイルのmaxmemoryパラメータで、単位はバイトです。この制限を超えると、構成ファイルの maxmemory-policy パラメータに従って不要なキーが削除されます。 maxmemory-policy のオプションのルールは次の 4 つです:

1. volatile-lru: LRU アルゴリズムを使用してキー (生存時間が設定されたキー) を削除します。

2. allkey-lru: LRU アルゴリズムを使用してキーを削除します。

3. Volatile-random: キーをすぐに削除します (有効期間が設定されたキー)。

4. allkey-random: キーをすぐに削除します。

5. volatile-ttl: 有効期限が近づいているキーを削除します。すべてのキーを走査して期限切れになりそうなキーを削除するのではなく、一度に N 個のキーを取り出し、その N 個のキーのうち期限切れになりそうなキーを削除することです。 Nって何ですか?設定ファイル。

6. Nevication: 削除しないでください。エラーを返します。

Redis はキーの有効期限を設定します - EXPIRE コマンド

EXPIRE key seconds

指定されたキーの生存時間を設定します。キーの有効期限が切れると (生存時間は 0)、自動的に削除されます。 。

Redis では、生存期間を持つキーを「揮発性」(揮発性) と呼びます。

ライフタイムを削除するには、DEL コマンドを使用してキー全体を削除するか、SET および GETSET コマンドで上書きします。これは、コマンドがライフタイムを持つキーのみを変更 (変更) する場合、値がキーが新しいキー値に置き換えられても、有効期間は変更されません。

たとえば、キーに対して INCR コマンドを実行したり、リストに対して LPUSH コマンドを実行したり、ハッシュ テーブルに対して HSET コマンドを実行したりしても、これらの操作によってキー自体の生存時間は変更されません。

一方、RENAME を使用してキーの名前を変更した場合、名前を変更したキーの生存時間は名前変更前と同じになります。

RENAME コマンドのもう 1 つの可能性は、有効期間を持つキーの名前を有効期間を持つ another_key に変更しようとすることです。このとき、古い another_key (およびその有効期間) は削除され、古いキーはしたがって、新しい another_key の生存時間は元のキーと同じになります。

PERSIST コマンドを使用すると、キーを削除せずにキーの有効期間を削除でき、キーを再び「永続的」キーにできるようになります。

生存時間の更新

すでに生存時間が設定されているキーに対して EXPIRE コマンドを実行すると、新しく指定した生存時間で古い生存時間が置き換えられます。

有効期限の精度

Redis 2.4 バージョンでは、有効期限の遅延は 1 秒以内です。つまり、キーの有効期限が切れている場合でも、有効期限が切れる可能性があります。期限切れ後も 1 秒以内にアクセスできますが、新しい Redis 2.6 バージョンでは、遅延が 1 ミリ秒未満に短縮されます。

Redis 2.1.3 より前の相違点

Redis 2.1.3 より前のバージョンでは、生存期間を指定してキーを変更すると、キー全体が削除され、この動作が発生します。これは当時のレプリケーション層の制限によるものでしたが、この制限は現在修正されています。利用可能なバージョン:

>= 1.0.0

時間計算量:

O(1)

戻り値:

设置成功返回 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入门教程栏目。

以上がRedis の生存時間の設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はoschina.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。