redisノート-データベースの期限切れキー削除ポリシー


2016-1-7 by Atlas
基本命令編では,EXPIRE,PEXPIRE,EXPIREAT,PEXPIREATの4つの期限切れキーのコマンドについて述べ,期限切れキー削除ポリシーを表す前に,この4つのコマンドの詳細を再確認する.
*有効期限の設定
  • EXPIRE---変換----->PEXPIRE
  • def EXPIRE(key,ttl_in_sec):
            //  TTL       
            ttl_in_ms = sec_to_ms(ttl_in_sec)
            //   PEXPIRE
            PEXPIRE(key,ttl_in_ms)
  • PEXPIRE---変換----->PEXPIREAT
  • def PEXPIRE(key,ttl_in_ms):
            //           UNIX   
            now_ms = get_current_unix_timestamp_in_ms()
            //       TTL,            
            PEXPIREAT(key,now_ms+tll_in_ms)
  • EXPIREAT---変換----->PEXPIREAT
  • def EXPIREAT(key,expire_time_in_sec):
            //             
            expire_time_in_ms = sec_to_ms(expire_time_in_sec)
            //   PEXPIREAT
            PEXPIREAT(key,expire_time_in_ms)

    EXPIRE、PEXPIRE、EXPIREATはいずれもPEXPIREATに適しており、PEXPIREAT関数によってキーの期限切れ操作が具体的に実現される.
    def PEXPIREAT(key,expire_time_in_ms):
            //              ,          
            if key not in redisDb.dict:
                    return 0
            //               
            redisDb.expires[key} = expire_time_in_ms
            //         
            return 1

    *期限切れキー削除ポリシー
    redisデフォルト削除ポリシーの組合せは(不活性削除+定期削除)です.
  • タイミング削除
  • ≪ポリシー|Policy|ldap≫:キーの有効期限を設定しながら、キーの有効期限が切れたときに、すぐにキーの削除操作を実行するタイマを作成します.利点:メモリにやさしく、期限切れキーができるだけ早く削除され、期限切れキーが使用するメモリが解放されることを保証します.欠点:CPU時間に対して友好的ではありませんて、多くのCPU時間を占有して、サーバーの応答時間とスループットに影響します.
  • 不活性削除
  • ≪ポリシー|Policy|emdw≫:期限切れキーを放っておいて、キー領域からの読み書き操作のたびに、キーが期限切れであるかどうかを確認します.期限切れである場合は、キーを削除し、期限切れでない場合は、キーを返します.利点:CPUに対して時間が友好的で、キーを読み書き操作する時やっとキーに対して期限切れの検査を行って、期限切れのキーを削除する操作は必ずしなければならない情況の下で行うことができます.欠点:メモリに友好的ではなく、キーを削除しない限り、メモリを解放せず、メモリを浪費しすぎ、メモリ漏れのリスクがある.実装:すべての読み書きデータベースのredisコマンドは実行前にexpireIfNeeded関数を呼び出して入力キーをチェックし、入力キーが期限切れになった場合、expireIfNeeded関数は期限切れキーを削除します.入力キーが期限切れでない場合、expireIfNeeded関数は使用されません.
  • 定期削除
  • ≪ポリシー|Policy|emdw≫:タイミング削除ポリシーと不活性削除ポリシーの統合と折衷.一定時間毎に期限切れキーの削除操作を行い、削除操作の実行時間と周波数を制限することによって、削除操作がCPU時間に与える影響を低減する.定期的に期限切れキーを削除することで、期限切れキーによるメモリの浪費を効果的に減らすことができます.難点:削除操作の実行時間と頻度を決定します.実行が頻繁すぎて、実行時間が長すぎると、タイミング削除ポリシーに劣化します.実行が少なすぎて、実行時間が短すぎて、不活性な削除ポリシーと同じようにメモリが浪費される場合があります.redisサーバは,不活性削除と定期削除の2つのポリシーを用いて,連携して使用することで,CPUを合理的に使用する時間とメモリの浪費を避けるバランスをとることができる.実装:1)所定の時間内に、サーバ内の各データベースを複数回に分けて巡回する.2)データベースのexpires辞書から一部のキーの有効期限をランダムにチェックする.3)期限切れキーを削除します.疑似コード:
    #             
    DEFAULT_DB_NUMBERS = 16
    #             
    DEFAULT_KEY_NUMBERS = 20
    #     ,      
    current_db = 0
    def activeExpireCycle():
            #             
            #             DEFAULT_DB_NUMBERS 
            #               
            if server.dbnum < DEFAULT_DB_NUMBERS:
                    db_numbers = server.dbnum
            else:
                    db_numbers = DEFAULT_DB_NUMBERS
            #        
            for i  in range(db_numbers):
                    #   current_db             
                    #                       
                    #  current_db   0,       
                    if current_db == server.dbnum:
                            current_db = 0
                    #            
                    redisDb = server.db[current_db]
                    #        1,            
                    current_db +=1
                    #       
                    for j in range(DEFAULT_KEY_NUMBERS):
                            #            ,         
                            if redisDb.expires.size() == 0:break
                            #               
                            key_with_ttl = redisDb.expires.get_random_key()
                            #        ,       
                            if is_expired(key_with_ttl):
                                    delete_key(key_with_ttl)
                            #               ,    
                            if reach_time_limit():return

    *RDB機能による期限切れキーの処理
    サーバがRDB機能を起動している場合.
  • RDBファイルを生成する場合:SAVEコマンドまたはBGSAVEコマンドを実行して新しいRDBファイルを作成する場合、プログラムはデータベース内のキーを検査し、期限切れのキーは新しく作成したRDBファイルに保存されない.
  • RDBファイルをロードする場合:1)サーバがプライマリサーバモードで動作している場合、RDBファイルをロードすると、プログラムはファイルに保存されているキーをチェックし、期限切れのキーはデータベースにロードされ、期限切れのキーは無視されるため、期限切れのキーはRDBファイルをロードするプライマリサーバに影響を与えない.2)サーバがスレーブ・モードで動作している場合、RDBファイルをロードすると、ファイルに保存されているすべてのキーが、期限切れにかかわらずデータベースにロードされます.ただし、マスタサーバは、データ同期を行うと、サーバからのデータベースが空になるので、一般的には、期限切れキーはRDBファイルにロードされたスレーブサーバにも影響を与えません.

  • *AOF機能による期限切れキーの処理
    サーバがAOF永続化モードで動作している場合.データベース内のキーが期限切れになっているが、不活性に削除されていないか、定期的に削除されていない場合、AOFファイルはこの期限切れのキーによって影響を与えません.期限切れキーが不活性に削除されたり、定期的に削除されたりすると、AOFファイルにDELコマンドが追加され、削除されたキーが表示されます.AOF書き換えの過程で、プログラムはデータベース内のキーを検査し、期限切れのキーは書き換え後のAOFファイルに保存されません.
    *コピー機能による期限切れキーの処理
    プライマリ・サーバは、1つの期限切れキーを削除すると、すべてのサーバからDELコマンドを表示的に送信し、この期限切れキーをサーバから削除するように通知します.サーバからクライアントから送信されたリードコマンドを実行すると、期限切れキーに遭遇しても期限切れキーは削除されず、未期限切れキーを処理するように期限切れキーを処理し続けます.サーバから有効期限切れキーは、プライマリサーバからのDELコマンドを受信した場合にのみ削除されます.
    参考文献:『redis設計と実現』