Redis-データベース

5966 ワード

サーバ内のデータベース
struct redisServer {
  	//     ,             
    redisDb *db;
    
    //          
    //         database    ,      16    
    int dbnum;
};

データベースの切り替え
デフォルトでは、redisクライアントのターゲット・データベースは0番データベースであり、SELECTコマンドでデータベースを切り替えることができます.
redis> SET msg "hello world"
OK

redis> GET msg
"hello world"

redis> SELECT 2
OK

redis[2]> GET msg
(nil)

クライアント状態redisClient構造のdb属性は、redisDb構造を指すポインタであるクライアントの現在のターゲットデータベースを記録する.
typedef struct redisClient {
    //                
    redisDb *db;
} redisClient;
redisClient.dbポインタを変更することにより、データベースの切り替え、すなわちSELECTコマンドの実現が可能となる
データベースキースペースredisDb構造のdict辞書は、データベース内のすべてのキー値ペアを保存します.
typedef struct redisDb {
    dict *dict;
}

キースペースは、ユーザーが見ているデータベースと直接対応しています.
  • キー空間のキー、すなわちデータベースのキーであり、各キーは文字列オブジェクトである.
  • キー空間の値、すなわちデータベースの値であり、各値は、文字列オブジェクト、リストオブジェクト、ハッシュ表オブジェクト、集合オブジェクト、および整列集合オブジェクトを含む任意のRedisオブジェクトであってもよい.

  • 新しいキーを追加
    データベースに新しいキー値ペアを追加すると、実際にはキー空間辞書に新しいキー値ペアを追加します.
    キーの削除
    データベース内のキーを削除するのは、実際にはキー空間内のキーに対応するキー値対オブジェクトを削除することです.
    DEL key [...]
    

    その他のキースペース操作FLUSHDB:データベース全体を空にするRANDOMKEY:ランダムに1つのキーを返します.DBSIZE:データベース・キーの数
    読み書きキー空間時のメンテナンス操作
  • キーが読み込まれた後(読み取り操作と書き込み操作の両方がキーを読み取ります)、サーバはキーが存在するかどうかに応じて、INFO stats命令のkeyspace_hitsプロパティとkeyspace_missesプロパティで表示できるように、サーバのキー空間ヒット回数またはキー空間ヒット(miss)回数を更新します.
  • キーを読み込むと、サーバはキーのLRU(最後の使用)時間を更新します.この値はキーのアイドル時間の計算に使用できます.コマンドOBJECT idletimeコマンドを使用して、キーkeyのアイドル時間を表示できます.
  • サーバが1つのキーを読み込んだときにキーが期限切れであることを発見した場合、サーバはこの期限切れのキーを削除してから、残りの他の操作を実行します.
  • クライアントがWATCHコマンドを使用してキーを監視している場合、サーバは監視されているキーを変更した後、このキーをダーティとマークし、トランザクションにこのキーが変更されたことに気づかせる.
  • サーバは、1つのキーを変更するたびに、サーバの永続化およびレプリケーション操作の実行をトリガする汚いキーカウンタの値を1つ増やします.
  • サーバがデータベース通知機能をオンにすると、キーを変更した後、サーバは構成に従って対応するデータベース通知を送信します.

  • キーの生存時間または有効期限の設定EXPIRE:生存時間を設定し、単位:秒.EXPIRE
    SET key value
    //        
    EXPIRE key 5
    
    PEXPIRE:生存時間、単位:ミリ秒を設定します.PEXPIRE EXPIREAT:有効期限を設定し、単位秒(タイムスタンプ)EXPIREAT PEXPIREAT:ミリ秒単位で有効期限を設定します.PEXPIREAT
    上の4つのコマンドは最後にPEXPIREATコマンドを使用して実現されます.TTL:生存時間のあるキーを受け入れ、このキーの残りの生存時間を返すPTTL:有効期限のあるキーを受け入れ、このキーの残りの生存時間を返します.
    保存の有効期限
    redisDb構造のexpires辞書は、データベース内のすべてのキーの有効期限を保存します.
  • 期限切れ辞書のキーは、キー空間内のキーオブジェクトを指すポインタです.
  • 期限切れ辞書の値は、ミリ秒精度のUNIXタイムスタンプ
  • であるlong longタイプの整数です.
    typedef struct redisDb {
        //     ,        
        dict *expires;
    } redisDb;
    

    有効期限の削除PERSIST
    期限切れキーの判定
    期限切れ辞書で、次の手順を確認します.
  • キーが期限切れ辞書にあるか否かを判定し、存在する場合は期限切れ時間
  • を返す.
  • は、現在のUNIXタイムスタンプがキーの有効期限よりも大きいか否かを判定し、もしそうであれば、キーの有効期限は
  • である.
    期限切れキー削除ポリシー
    タイミング削除
    キーの有効期限を設定しながら、キーの有効期限が来たときに、すぐにキーの削除操作を実行するタイマを作成します.
  • メモリに友好的で、期限切れのキーが占有するメモリ
  • をできるだけ早く解放する.
  • はCPUに友好的ではない、特に期限切れキーが比較的多い場合
  • である.
    不活性削除
    キースペースからキーを取得するたびに、取得したキーが期限切れであるかをチェックし、期限切れであればそのキーを削除し、期限切れでなければそのキーを返します
  • CPUに友好的な
  • はメモリに友好的ではありません.特に期限切れのキーがたくさんありますが、アクセスしていない場合は
  • です.
    定期的に削除
    一定時間ごとに、プログラムはデータベースをチェックし、中の期限切れキーを削除します.
    最も重要なのは、削除操作の実行時間と実行頻度を合理的に設定することです.
    Redisの期限切れキー削除ポリシー
    不活性削除ポリシーの実装
    期限切れキーの不活性削除ポリシーはdb.c/expireIfNeeded関数によって実現され、すべての読み書きデータベースのRedisコマンドは実行前にこの関数を呼び出して入力キーをチェックします.
    参考:Redis設計と実装