多くの異なるアイテムがあり、各アイテムへのヒット数を追跡し、特定の日時範囲内の各アイテムのヒット数を毎秒までクエリしたいと考えています。
だから私はヒットを並べ替えられたセットに保存し始めました。たとえば、毎秒(UNIXエポック時間)に1つの並べ替えられたセットです:
zincrby ItemCount:1346742000 item1 1
zincrby ItemCount:1346742000 item2 1
zincrby ItemCount:1346742001 item1 1
zincrby ItemCount:1346742005 item9 1
特定の日付範囲内の各アイテムの総ヒット数を取得するには、次のようにします。
1. Given a start datetime and end datetime:
Calculate the range of epochs that fall under that range.
2. Generate the key names for each sorted set using the epoch values example:
ItemCount:1346742001, ItemCount:1346742002, ItemCount:1346742003
3. Use Union store to aggregate all the values from different sorted sets
ZUINIONSTORE _item_count KEYS....
4. To get the final results out:
ZRANGE _item_count 0, -1 withscores
それはちょっとうまくいきますが、1か月のような大きな日付範囲がある場合、ステップ1と2から計算されたキー名の数が数百万(1日あたり86400エポック値)になると問題が発生します。このような多数のキーがあると、ZUINIONSTORE コマンドが失敗し、ソケットが壊れます。さらに、ループして多くのキーを生成するには時間がかかります。
これを Redis でより効率的な方法で設計し、追跡の粒度を数分や数日ではなく数秒にまで抑えるにはどうすればよいでしょうか。