Redisベース(3)-有効期限

3004 ワード

Redis有効期限


コマンドの説明


実際の開発では時効のあるデータに遭遇します.システムリソースの浪費を避けるために、これらのデータを削除する必要があります.リレーショナル・データベースでは、一般的に、期限切れのデータを記録し、期限切れのデータを定期的に検出するために追加のフィールドが必要です.一方、redisでは、EXPIREコマンドを使用してキーの有効期限を設定し、時間になるとRedisが自動的に削除されます.

コマンド#コマンド#

EXPIRE key seconds
// seconds       ,    。

PEXPIRE key milliseconds
// milliseconds      ,     。

TTL key
//     key     
//      -1,      key      
//      -2,    key   

PERSIST key
//         ,           ,   1,    0

EXPIREAT key time
// time      , Unix   

PEXPIREAT key time
// time      , Unix   ,   ms

バージョン差異:2.6バージョンでは、TTLの戻り値はkeyが存在するかどうかにかかわらず、有効期限がない限り-1を返します。2.8バージョンになってから2つの状況が分離されました。

PERSISTコマンドに加えて、SETまたはGETSETコマンドを使用してkeyに値を再割り当てしても、有効期限を取り消すことができます。>*EXPIREを使用するとキーの有効期限が再設定されます。 他のキー値のみを操作するコマンド(INCR、LPUSH、HSET、ZREMなど)は、キーの有効期限に影響しません。 EXPIREコマンドのsecondsパラメータは整数でなければなりませんので、最も正確な単位は1 sです。 WATCHコマンドを使用して有効期限を持つキーをモニタした場合、そのキーは有効期限が切れた後に自動的に削除され、WATCHコマンドでキーが変更されたとはみなされません。

アクセス頻度の制御を実現


方法1
#          10 
$isKeyExists = EXISTS rate.limiting:$IP
if $isKeyExists is 1
    $times = INCR rate.limiting:$IP
    if $times > 100
        print         ,     
        exit
else
    MULTI
    INCR rate.limiting:$IP
    EXPIRE rate.limiting:$IP
    EXEC

方法は,同じ分の最後の秒に9回,次の分の最初の秒に10回アクセスするバグがあり,これは2 sの時間で19回アクセスしたことに相当する.そこで私たちは方法2を提出しました.
#             10
$listLength = LLEN rate.limiting:$IP
if $ilstLength < 10
    LPUSH rate.limiting:$IP now()
else
    $time = LINDEX rate.limiting:$IP -1
    if now()-$time < 60
        print         
    else
        LPUSH rate.limiting:$IP now()
        LTRIM rate.limiting:$IP 0 9

方法2は制限回数が小さい場合に適しており,そうでないとより多くの空間を占有する.

キャッシュの実装


Webサイトの負荷能力を向上させるには、いくつかの要求頻度を高くする必要がありますが、CPUまたはIOリソースの消費が比較的大きい操作の結果をキャッシュし、一定時間自動期限切れを設定します.
次の例は、学生ランキングのキャッシュダミーコードです.
$rank = GET cache:rank
if not rank
    $rank =     ……
    MULTI
    SET cache:rank $rank
    EXPIRE cache:rank 7200
    EXEC

メモリが限られている場合、キャッシュキーを大量に使用し、キャッシュ時間が長すぎるとredisがメモリをいっぱいにする。一方、redisがメモリをフルにすることを防止するために短い生存時間を設定すると、キャッシュヒット率が低くなり、大量のメモリがアイドルになる可能性がある。キャッシュに合理的な生存時間を設定することは困難であるため、redisが使用できる最大メモリを制限し、redisをルールに従って不要なキャッシュキーを淘汰させることができ、redisをキャッシュシステムとしてのみ使用する場合に非常に実用的である。

具体的な設定方法は次のとおりです.
プロファイルのmaxmemoryパラメータを変更し、redisの最大使用可能メモリサイズ(バイト単位)を制限します.この制限を超えると、redisはmaxmemory-policyパラメータに基づいて対応するポリシーを指定して、Redisが指定したしきい値よりもメモリを消費するまで不要なkeyを削除します.
maxmemory-policyがサポートするルール:
LRU(least recently used)は、最近最も使用されているkeyであり、将来的には使用されないと考えられ、スペースが必要な場合は削除することができる.
ルール#ルール#
説明
volatile-lru
LRUアルゴリズムを使用して、有効期限が設定されているkeyを削除します.
allkeys-lru
LRUアルゴリズムを使用してキーを削除
volatile-random
有効期限が設定されているkeyをランダムに削除
allkeys-random
キーをランダムに削除
volatile-ttl
期限切れの最近のkeyを削除
noeviction
keyを削除せず、エラーのみを報告