5

私は redis から dynamoDB に移行しようとしていますが、すべてがうまく機能しています! 私がまだ把握していない唯一のことは、キーの有効期限です。現在、次のように、主キーが 1 つあり、範囲キーがないデータ設定があります。

{
  "key" => string,
  "value" => ["string", "string"],
  "timestamp" => seconds since epoch
}

私が考えていたのは、タイムスタンプが特定の値よりも小さい場所をデータベースでスキャンし、明示的に削除することでした。ただし、これは非常に非効率的で、理由もなく途方もない数の読み取り/書き込みユニットを使い果たしてしまいます。その上、有効期限はスキャンを実行したときにのみ発生するため、おそらく蓄積される可能性があります.

それで、誰かがこの問題の良い解決策を見つけましたか?

4

4 に答える 4

7

Redis を使用していたのと同じように、DynamoDB も使用しています。

私の提案は、キーを別のタイム スライス テーブルに書き込むことです。

たとえば、あるタイプのレコードが数分、長くても 1 時間未満の場合、次のことができます。

  1. このタイプのレコード用に毎日新しいテーブルを作成し、新しいレコードを今日のテーブルに保存します。
  2. レコードを読み取るときは、読み取り修復のヒントを使用します。つまり、今日のテーブルでレコードが見つからない場合は、昨日のテーブルで見つけて、必要に応じて今日のテーブルに入れます。
  3. いずれかのテーブルでレコードが見つかった場合は、そのタイムスタンプで確認してください。現時点では、期限切れのレコードを削除する必要はありません。
  4. 古いテーブル全体をタスクにドロップします。

これにより、保守が容易になり、費用対効果が高くなります。

于 2014-01-24T03:08:17.487 に答える
5

遅延有効期限を実行し、要求に応じて削除できます。

例えば:

  • 属性「有効期限」を持つストア キー「a」は、10 分で有効期限が切れます。
  • 9分で取り出し、賞味期限を確認して返却。
  • 11 分で取得します。有効期限を確認します。今より少ないので、エントリを削除します。

これは、数年前にソースを見たときに memcached が行っていたことです。

古いエントリをすべて削除するには、スキャンを実行する必要があります。

永続的なデータ ストアではなく、キャッシュ用の Elasticache の使用を検討することもできます。

于 2012-05-01T20:10:30.907 に答える
1

タイムスタンプをインデックス化される範囲キーとして使用し、時間に基づいて簡単に操作できるようにすることができます。

于 2012-02-18T18:29:49.153 に答える