Redisデータの期限切れポリシーの検討

5494 ワード

EXPIRE key secondsコマンドでデータの有効期限を設定します.戻り1は設定に成功したことを示し、戻り0はkeyが存在しないか、期限切れの設定に成功しないことを示します.
キーに有効期限が設定されている場合、キーは指定した秒数後に自動的に削除されます.有効期限が指定されたkeyはRedisでは不安定と呼ばれている.キーがDELコマンドによって削除されたり、SET、GETSETコマンドによってリセットされたりすると、それに関連付けられた有効期限がクリアされます.
redis 127.0.0.1:6379> set mykey "test expire"
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 97
redis 127.0.0.1:6379> ttl mykey
(integer) 93
redis 127.0.0.1:6379> set mykey "test expire reset"
OK
redis 127.0.0.1:6379> ttl mykey
(integer) -1

redis 127.0.0.1:6379> set mykey "test expire"
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 98
redis 127.0.0.1:6379> ttl mykey
(integer) 91
redis 127.0.0.1:6379> getset mykey "test expire reset"
"test expire"
redis 127.0.0.1:6379> ttl mykey
(integer) -1
これはまた、keyの元の値を新しい値に置き換えずにkeyに格納された値のみを概念的に更新したすべての操作が、そのkeyに設定された期限切れに影響を及ぼさないことを意味する.たとえばINCRコマンドを使用してkeyの値を増やしたり、LPUSHコマンドを使用してlistに新しい要素を追加したり、HSETコマンドを使用してhashフィールドの値を更新したりすると、元の有効期限設定がクリアされます.
redis 127.0.0.1:6379> set mykey 1
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 95
redis 127.0.0.1:6379> incr mykey
(integer) 2
redis 127.0.0.1:6379> ttl mykey
(integer) 77

redis 127.0.0.1:6379> lpush listkey 1
(integer) 1
redis 127.0.0.1:6379> expire listkey 100
(integer) 1
redis 127.0.0.1:6379> ttl listkey
(integer) 94
redis 127.0.0.1:6379> lpush listkey 2
(integer) 2
redis 127.0.0.1:6379> ttl listkey
(integer) 82

redis 127.0.0.1:6379> hmset hashkey name "redis" passwd "redis"
OK
redis 127.0.0.1:6379> expire hashkey 100
(integer) 1
redis 127.0.0.1:6379> ttl hashkey
(integer) 95
redis 127.0.0.1:6379> hset hashkey  passwd "redis.vs.mysql"
(integer) 0
redis 127.0.0.1:6379> ttl hashkey
(integer) 66
はもちろん、PERSISTコマンドによって設定された期限切れをクリアしてkeyを永続化することもできます.
redis 127.0.0.1:6379> set mykey 'test clear expire'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 96
redis 127.0.0.1:6379> persist mykey
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) -1
キーがRENAMEコマンドによって名前が変更されると、それに関連付けられた有効期限が新しい名前のキーに渡されます.
redis 127.0.0.1:6379> get mykeynew
(nil)
redis 127.0.0.1:6379> set mykey 'test expire transfer'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 96
redis 127.0.0.1:6379> rename mykey mykeynew
OK
redis 127.0.0.1:6379> ttl mykey
(integer) -1
redis 127.0.0.1:6379> ttl mykeynew
(integer) 80
keyがRENAMEコマンドによって書き換えられた場合、例えば本存在名mykey_aとmykey_bのkeyひとつRENAME mykey_b mykey_aコマンドmykey_b既存のmykeyに名前を変更するaじゃあmykey_a元の設定がどのようにmykeyを継承するかbのすべての特性、期限切れの設定を含む.
redis 127.0.0.1:6379> set mykey_b 'b'
OK
redis 127.0.0.1:6379> set mykey_a 'a'
OK
redis 127.0.0.1:6379> expire mykey_b 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey_b
(integer) 93
redis 127.0.0.1:6379> ttl mykey_a
(integer) -1
redis 127.0.0.1:6379> rename mykey_b mykey_a
OK
redis 127.0.0.1:6379> ttl mykey_b
(integer) -1
redis 127.0.0.1:6379> ttl mykey_a
(integer) 66
EXPIRE key secondsが有効期限が設定されているkeyに適用されると、既存の有効期限が新しい有効期限に更新されます.
redis 127.0.0.1:6379> set mykey 'test expire update'
OK
redis 127.0.0.1:6379> expire mykey 100
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 95
redis 127.0.0.1:6379> expire mykey 1000
(integer) 1
redis 127.0.0.1:6379> ttl mykey
(integer) 998

付録:
keyの有効期限
通常、Redisキーが作成された場合、有効期限は自動的に関連付けられず、DELなどのコマンドで表示された削除を除き、キーは長く存在します.EXPIREコマンドクラスタは、指定したkeyに期限切れを関連付けることができ、追加のメモリオーバーヘッドの代価を払うことができます.キーが有効期限が設定されている場合、Redisはタイムアウト時にキーを削除することを保証します.keyの有効期限はEXPIREコマンドによって更新されるか、またはPERSISTコマンドによって完全に除去されることができる.
有効期限の精度
Redis2.4の中でexpireの精度は高くなくて、通常0から1秒の間で、Redis 2.6以降のexpire精度は0~1ミリ秒以内に制御できます.
期限切れと永続化
keyの期限切れ情報は絶対Unixタイムスタンプとして格納される(Redis 2.6以降はミリ秒レベルの精度で格納される).これは、Redisインスタンスが実行されていなくてもkeyの有効期限に影響を与えないことを意味します.
期限切れの時間をより正確に動作させるためには、コンピュータの時間をチェックする必要があります.RDBスナップショットを1台のコンピュータから別のコンピュータに移動すると、データがロードされたばかりでタイムアウトしたり、遅延したりするコンピュータで面白いことが起こります.同じマシンの同じ例でも、コンピュータの時間が正しくないか、または変化が発生した場合、例えば、データのロットの有効期限が1000に設定され、その後、コンピュータの時間が意外にも2000秒速くなると、これらのkeyは1000秒後に有効期限が切れるのではなく、すぐに有効期限が切れます.
Redisはkeyを期限切れにする方法
Redis keyが期限切れになる方法は2つあります.
受動方式とアクティブ方式
クライアントが有効期限が設定され、有効期限が切れたkeyにアクセスしようとすると、アクティブ期限が切れます.
しかし、それだけでは十分ではありません.いくつかのkeyが二度とアクセスされない可能性があると思っています.これらの期限切れを設定したkeyも期限切れ後に削除する必要があります.したがって、Redisは、期限切れのkeyが設定されたバッチを周期的にランダムにテストして処理します.テストされた期限切れのkeyは削除されます.典型的には、Redisは毎秒10回以下のステップを行う.
1.期限切れが設定されているkey 100個をランダムにテスト
2.発見された期限切れのkeyをすべて削除
3.削除したキーが25個を超えるとステップ1を繰り返す
これは確率に基づく簡単なアルゴリズムであり、基本的な仮定は、抽出されたサンプルがkey空間全体を表すことができ、redisは期限切れのデータを期限切れのkeyの割合が25%以下に下がるまでクリーンアップし続けることである.これは、任意の所定の時点で期限が切れたがメモリ領域を占有するkeyの量が、最大1秒当たりの書き込み操作量を4で割ったことを意味する.
Replication linkおよびAOFファイルでの期限切れ処理
整合性の問題を引き起こすことなく、正しい動作を得るために、1つのkeyが期限切れになると、DEL操作はAOFファイルに記録され、関連するすべてのslaveに渡される.すなわち、期限切れの削除操作は、salveがそれぞれコントロールするのではなく、masterインスタンスで統一され、下に渡されます.これにより、データが一致しない場合があります.slaveがmasterに接続された後、期限切れのkeyをすぐにクリーンアップすることはできません(masterから渡されるDEL操作を待つ必要があります).slaveは、slaveがmasterに昇格すると、masterのように独立して期限切れの処理を行うことができるように、データセットの期限切れ状態を管理メンテナンスする必要があります.