2

ソートされたセットとリストを使用して実装している3つのスコアボードが必要なアプリを構築しています。アプリは、redisクライアントのnode_redis(https://github.com/mranney/node_redis)モジュールを使用してnode.jsで実行されています。

最初のスコアボードは、私がリストを使用している「最新のスコア」ですLPUSHZADD2つ目は、コマンドで並べ替えられたリストを使用している、これまでにない高得点です。

「今週のハイスコア」の実装に問題があります。1週間セットで使っZADDて別のソートリストを使うべきだと思っていました。EXPIREそれはすべて正常に機能しますが、リストが初めて期限切れになった後も、新しいリストに永久に追加され続けます。

自動更新するために期限切れにするredisコマンドはありますか?(私はここ数時間答えを探していましたが、答えはノーのようです)。プログラムでこれを行う必要があるという結論に達しました。TTLセットを使用する関数呼び出し中に、が-1であるかどうかを確認し、そこでリセットすることができました。これはベストプラクティスですか?私はどこかで巧妙なトリックを逃していますか?追加のデータベース要求について心配する必要がありますか?

- 編集 -

ツイッターでこの質問に返信しましたhttps://twitter.com/redsmin/status/302177241167691777

推奨される解決策(私が正しく理解している場合)はEXPIREAT、それぞれと一緒にコマンドを使用することですZADD

expireat myscoreboard {{timestamp of the end of the week}} 
zadd myscoreboard 1 "one"

これは私には正しいと感じますが、私はredisを初めて使用するので、この手法や問題を解決する他の方法について話し合っていただければ幸いです。

4

1 に答える 1

1

それはあなたが「一週間」をどのように定義するかに依存します。それを使用するいくつかの方法があります、例えば:

  1. 「過去7日間」
  2. 「今年の週」
  3. 「今週は日曜日に始まり、土曜日に終わります」

実装が最も簡単なのは2と3です。1週間の有効期限を使用して、開始日時をキー名に含むセットを指定します。次に、クライアント側で必要な日を決定し、データを取得するだけです。

たとえば、zadd scoreboard:weekly:03:March:2013 1 "bob"

次の週のキー名はzaddscoreboard:weekly:10:March:2013 1 "bob"

最初にキーを作成するときに、有効期限を設定します。これですべてです。毎回リセットする必要はありません。擬似コードは次のとおりです。

if(ttl scoreboard:weekly:03:March:2013)== 0:expire scoreboard:weekly:03:March:2013 604800

このように、有効期限を1回だけ設定し、自動有効期限を取得して、毎週のスコアボードを簡単に引き出すことができます。

同じ方法を使用してローリングウィークを実装することもできますが、毎日のキー名に移動し、取得するキーを計算してから、それらをマージする必要があります。zunionstoreを使用してこれを行うことができます。

于 2013-03-02T20:16:10.413 に答える