0

次のグループの情報を保存しようとしています。1 分間のタイムスタンプ (たとえば、1 分間のウィンドウに表示されるすべての browserID をグループ化) を保存し、次にブラウザー参照のリストを保存します。ブラウザIDのインスタンスを1つだけ持てるようにしたい

このデータ構造に使用できる Redis のデータ構造は? より最適な保管方法はありますか?

...
12:06 -> browser1, browser7
12:07 -> browser8
12:08 -> browser4, browser5, browser6, browser9
...

各行の有効期間は約 1 日です。

新しい browserID を追加するとき、最初にブラウザ ID がデータのどこかに既に存在するかどうかを確認します。存在する場合は、削除して新しい分の行に追加します。

最後に、1 分ごとに 30 分前の行を取得してそれらの browserID を処理し、完全に処理されたらリストからその行を削除します。

このデータ構造には、一度に最大 100 万のブラウザ参照が存在する可能性があります。

4

2 に答える 2

1

わかりました、新しい情報、新しい答え:)

各ブラウザをデータベース内のキーにして、現在のタイムスタンプを指します。また、「含まれる」ブラウザのセットとともに、各タイムスタンプのキーも作成します。

新しいブラウザが追加されたとき。

  1. キーが存在するかどうかを確認して、システムに既に存在するかどうかを確認します。
  2. そうである場合は、それが属するタイムスタンプを確認し、古いタイムスタンプから削除して、新しいタイムスタンプに追加します。ブラウザ キーを更新します。
  3. そうでない場合は、タイム スタンプに追加し、ブラウザ キーを設定します。

キーを期限切れにするには、おそらく組み込みの期限切れを使用せず、代わりに cron ジョブなどを使用して

  1. タイムスタンプ内のすべてのブラウザ キーを削除します
  2. タイムスタンプ キーを削除します。

データ構造の例。

ts:12:01 -> {1, 3}
ts:12:02 -> {2}

browser:1 -> 12:01
browser:2 -> 12:02
browser:3 -> 12:01

これは合理的に O(1) である必要がありますが、一定時間はわずかに長くなります (操作ごとに複数の要求)。サーバー側の Ruby スクリプトを使用することで削減できる可能性があります。

それが役立つことを願っています!

于 2013-03-11T18:21:19.853 に答える
0

リストで十分です。実際、ブラウザーの数が 400 未満の場合 (conf ファイルによると、デフォルトは 400)、Redis は、スペース効率のために、置換リストに順次配列を実装します。

詳細情報: https://github.com/antirez/redis/blob/unstable/src/ziplist.h

于 2013-03-11T10:14:42.183 に答える