Redisはデータを保持しますか?


122

Redisはメモリからすべてのデータを提供することを理解していますが、サーバーの再起動後も維持されるため、サーバーの再起動時にディスクからすべてのデータがメモリに読み込まれます。それとも、アプリが永続性なしで実行されている間のみデータを保存するための常に空白のストアですか?


1
私はあなたの質問を正しく理解しているかどうかわかりません。スナップショットをディスクに保存し、そのファイルから読み取ることができます。そうしないと、再起動時にredisデータベースが空になります。
Sefa 2014

回答:


82

これについてhttp://redis.io/topics/persistenceで読むことをお勧めします。基本的に、メモリ内の格納のみを使用してパフォーマンスを向上させると、保証された永続性が失われます。メモリにINSERTするシナリオを想像してください。ただし、ディスクに永続化される前に電源が失われます。データが失われます。

Redisは、いわゆる「スナップショット」をサポートしています。これは、ある時点(たとえば、1時間ごと)にメモリ内のwhatsの完全なコピーを実行することを意味します。2つのスナップショット間で電源が失われると、最後のスナップショットとクラッシュの間の時間からデータが失われます(停電である必要はありません。)。Redisは、ほとんどのNoSQL-DBと同様に、データの安全性とパフォーマンスをトレードオフします。

ほとんどのNoSQLデータベースは、このリスクを最小限に抑えるために、複数のノード間のレプリケーションの概念に従っています。Redisは、データの一貫性を保証するデータベースではなく、より高速なキャッシュと見なされています。したがって、その使用例は通常、実際のデータベースの使用例とは異なります。たとえば、セッション、パフォーマンスカウンターなどを格納して、比類のないパフォーマンスを実現し、クラッシュした場合でも実際の損失はありません。ただし、注文/購入履歴などの処理は、従来のデータベースの仕事と見なされています。


1
デフォルトの永続化動作を追加できると便利です。@Leonid Beschastnyの回答のように。
イェヤ2018

40

Redisサーバーは、すべてのデータをHDDに時々保存するため、ある程度の永続性が提供されます。

次のいずれかの場合にデータを保存します。

  • 時々自動的に
  • コマンドを手動で呼び出すときBGSAVE
  • redisがシャットダウンしているとき

しかし、redisのデータは実際には永続的ではありません。

  • redisプロセスのクラッシュは、最後の保存以降のすべての変更を失うことを意味します
  • BGSAVE 操作は、十分な空きRAMがある場合にのみ実行できます(追加のRAMの量は、redis DBのサイズと同じです)

注意: BGSAVE RAM要件は実際の問題です。これは、実行するRAMがなくなるまでredisは動作し続けるためですが、HDDへのデータの保存がはるかに早く停止します(RAMの約50%)。

詳細については、Redisの永続性を参照してください。


1
この回答が書かれたので、redisはAOFと呼ばれる別の永続化モデルを導入しました。これにより、永続性が大幅に向上しますが、ディスク使用率が高くなり、サーバーの起動が遅くなるなど、他のいくつかの欠点があります。
Leonid Beschastny

15

それは構成の問題です。Redisでは、データの永続性をまったく、部分的に、または完全に保持できます。最良の決定は、プロジェクトの技術的およびビジネス上のニーズによって決まります。

永続性に関するRedisのドキュメントによれば、インスタンスを設定して、時々、または各クエリでデータをディスクに保存することができます。これらはAOFとRDBの2つの戦略/メソッドを提供します(そのときの詳細については、ドキュメントを参照してください)。それぞれを単独で、または一緒に使用できます。

「SQLのような永続性」が必要な場合は、次のように述べています。

一般的な指摘は、PostgreSQLが提供できるものと同等のデータの安全性が必要な場合は、両方の永続化メソッドを使用する必要があることです。


7

答えは一般的にはいですが、より完全な答えは、保存しようとしているデータの種類によって異なります。一般に、より完全な短い答えは次のとおりです。

  • Redisは主にパフォーマンスに焦点を当てているため、永続ストレージには最適ではありません
  • Redisは、現在の状態データの信頼性の高いインメモリストレージ/キャッシュ、特に複数のクライアント/サーバーで使用されるデータの中央ソースを提供することでスケーラビリティを可能にするために、より適しています

そうは言っても、デフォルトではRedis 定期的にデータスナップショットを保持します(どうやらこれは1分ごとですが、これは確認していません。これは、以下の記事で説明されています。これは基本的なイントロです):

http://qnimate.com/redis-permanent-storage/


TL; DR

公式ドキュメントから:

  • RDBパーシスタンス [デフォルト]は、指定された間隔でデータセットの特定の時点のスナップショットを実行します。
  • AOFの永続性 (明示的に構成する必要があります)は、サーバーが受信したすべての書き込み操作をログに記録します。これはサーバーの起動時に再び再生され、元のデータセットを再構築します。

これが必要な場合、Redis をAOF永続化用に明示的に構成する必要があります。これにより、パフォーマンスが低下するだけでなく、ログが増大します。限られた量のデータフローが比較的信頼性の高い状態で持続するのに十分な場合があります。


5

永続性をまったく選択しないこともできます。パフォーマンスは向上しますが、Redisをシャットダウンするとすべてのデータが失われます。

Redisには2つの永続化メカニズムがあります。RDBとAOFです。RDBはスケジューラのグローバルスナップショットを使用し、AOFは更新をMySqlのようなapappend-onlyログファイルに書き込みます。

Redisを再起動すると、RDBファイルまたはAOFファイルを読み取ってデータが構築されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.