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 サイトの他の関連記事を参照してください。