2016-04-22 11 views
0

私は数百のサッカーゲームを私のredusデータベースに保存しています。彼らはキーの下にハッシュで保存されています:games:soccer:data私は3つのzのセットを持って来て、ライブにそれらをclasifyし、終了しました。すべての日付(スコア)順。こうすれば、すぐに始まるか、すでに起こっているか、すでに終了しているかによって、簡単に検索できます。さて、私はリーグ名でそれらを取得できるようにしたい。レディスでリーグ名でサッカーゲームを検索する最善の方法は何ですか?

私は2つの選択肢を思い付いた:

まず代替:ゲームIDとリーグ名を含む単一のハッシュ保存。この方法では、すべてのライブゲームIDを取得し、それぞれのハッシュに対して各IDを確認し、必要なリーグ名に一致する場合は配列にプッシュし、そうでなければスキップします。最後に、必要なリーグのすべてのゲームIDを配列に返します。

第二の代替:は、各リーグのキーを作成し、今後のライブがあり、それぞれのセットを終えました。このようにして、ゲームIDを取得する方が速くなると思います。しかし、各セットを維持することは苦痛であろう。

これ以外の方法がある場合は、お知らせください。並べ替えが高速でメモリが節約できるかどうかはわかりません。

私はスピードとメモリ使用量を探しています。

(ホッブズ代替以下)EDIT

 const multi = client.multi(); 
     const tempSet = 'users:data:14:sports:soccer:lists:temp_' + getTimestamp(); 

     return multi 
     .sunionstore(
     tempSet, 
     [ 
      'sports:soccer:lists:leagueNames:Bundesliga', 
      'sports:soccer:lists:leagueNames:La Liga' 
     ] 
    ) 
     .zinterstore(
     'users:data:14:sports:soccer:lists:live', 
     2, 
     'sports:lists:live', 
     tempSet 
    ) 
     .del(tempSet) 
     .execAsync() 

私は私のクエリにAGGREGATE MAXを設定する必要があると私はどのようには考えています。

答えて

0

1つの方法は、各リーグのすべてのゲームを含むSETを使用し、ZINTERSTOREを使用してリーグセットと既存のセットの共通部分を計算することです。データを照会するたびにZINTERSTOREを実行することができます(データが非常に大きい場合を除いて恐ろしく高価な操作ではありません)。または、「親」セットのいずれかに書き込む場合にのみ行うことができます。あなたがそれをクエリに行くときに存在しない場合にのみ、短いTTLを与え、それを作成することによってキャッシュの一種。

+0

各リーグのすべてのゲームを含むこのSETが何千ものエントリで非常に大きくなるとどうなりますか?そのサイズは重要ですか? – ElPirru

+0

@ElPirruそれは問題ですが、何千もの "非常に大きい"ではなく、問題になる可能性は低いです。しかし、確かに、いくつかのテストデータを作成し、パフォーマンスを測定してください! – hobbs

+0

私はいくつかのテストを実行し、結果をポストバックします。私は、サイズを「小さく」保つためにx時間以上のゲームを削除することも、2つのSETを持つこともできます.1つは1か月より新しいゲームで、残りのゲームは他のゲームで行います。もし私がハッシュからゲームのリーグをレトリーブし、そこから新しいセットを作るとすれば?これは私が推測するソート関数を使用するでしょう.... – ElPirru

関連する問題