#Redis は現在の Web プログラミングに欠かせないサービスですが、その特徴は明らかで、memcached と比較してデータを失わずにキャッシュして再起動できるため、非常に使いやすいです。そこで問題は、それがどのように行われるのかということです。
RDB
RDB は永続化の手段であり、特定の条件下でメモリ内のデータをディスクに書き込みます。では、どのような条件で書かれているのでしょうか?何も考えずに書くことは不可能です。1つずつ書くとパフォーマンスに影響します。1つ書くまでに長い時間待つことはできません。途中でダウンタイムが発生してすべてのデータが失われる場合は、使用した方が良いです。 memcached。 Redis 構成には次のような構成があります:
save 900 1
save 300 10
save 60 10000
非常に重要な構成部分であり、これは RDB 永続性の中核です。意味:
1. 900 秒以内に 1 つのキーが変更 (挿入または更新) された場合、それをディスクに同期します
2. 300 秒以内に、If 10 がありますキーの変更 (挿入または更新) がある場合は、ディスクに同期します
#3。60 秒間に 10,000 回のキーの変更 (挿入または更新) がある場合、ディスクに同期しますこれらの時点と変更の数はどうやって知るのですか? 現時点では他に非常に重要なものが 2 つあり、1 つはダーティ カウンターと呼ばれ、もう 1 つは lastsave (最後の保存の時刻) と呼ばれます。具体的には、最後に保存してからの時間を記録します。キーの数を変更します。Lastsave は、保存が実行された時間を記録します。たとえば、初期時間は time1 で、ダーティは 0 です。この時点では、20 個のキーが変更されており、ダーティは 20 です、現在時刻が time2、time2-time1 >= 300 の場合、2 番目の条件が満たされると、メモリ内のデータが保存され、dirty が 0 にクリアされ、条件がトリガーされるのを待ちます。 60 秒以内に 100,000 個のキーがある場合、問題が発生します。大量のディスク IO が発生すると、redis のメイン プロセスがブロックされ、その間のすべてのコマンドが実行されなくなります。これはできるでしょうか? そこで、bgsave と呼ばれるプロセスが登場しました。これは、メインの Redis プロセスからフォークされたサブプロセスであり、RDB 永続化作業の実行に特化しています。 保存されたファイル形式はバイナリ形式です。データベースがダウンした場合でも、人間による回復は必要なく、redis が自動的にディスク ファイルを読み取ります。AOF
AOF は RDB とは異なり、実行したコマンドを保存します。aof 機能をオンにすると、実行された更新コマンドは aof に直接書き込まれません。ファイル。最初に aof buf に書き込む代わりに、常に buf に書き込むことができるわけではないことがわかっています。buf はメモリでもあるため、いつディスクに同期できるでしょうか? redis にもそのような構成があります。appendfsync alwaysappendfsync Everysecappendfsync no 意味: 1.更新があるので、コマンド 2 を同期します。最後の同期時刻が今から 1 秒以上後である場合は、3 を同期します。同期されていない場合は、動作を待ちます。システム自体が判断します (暇なときに同期します))分析中、最初のタイプの IO は頻繁であり、IO プレッシャーが高いですが、データが失われる可能性は最も小さいです。 3 番目のタイプの IO は、プレッシャーがほとんどなく、データが失われる可能性が高すぎるタイプです。すべてを考慮すると、一般的には 2 番目のオプションです。しかし、まだ疑問があります。INCR num を 100 回実行しました。論理的には、num は 100 です。aof には同じコマンドが 100 個あります。何も問題はありません。では、INCR num を 100 回実行するのと SET num 100 回を実行するのとの違いは何ですか? ? 結果は同じですが、前者は99倍のスペースを必要とし、非常に無駄なので、AOF書き換えが登場しました。これは非常に単純で、まずデータベースから現在の値を読み取り、それをレコードに置き換えるという、AOF 書き換えの原理です。書き換えには時間がかかるため、子プロセスで処理します。書き換えプロセス中に、新しいコマンドが来た場合はどうすればよいでしょうか? 古い方法では、buf バッファーに書き込みます。書き換えが完了したら、buf 内のコマンドを新しい aof に追加し、古い aof をnew aof. 書き換えを実装しました。 この記事はredis チュートリアル から引用したものです。ぜひ学習してください。
以上がRedis で永続性を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。