はい、ソートされたセットは非常に高速で強力です。 SORTよりも、要件にはるかによく一致しているようです。 オペレーション。時間計算量はしばしば誤解されます。 O(log(N))は非常に高速で、適切にスケーリングされます。 1つのソートされたセットで数千万のメンバーに使用します。取得と挿入はミリ秒未満です。
ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]を使用します 結果を得るには。
タイムスタンプを「スコア」として保存する方法によっては、ZREVRANGEBYSCOREの方が適している場合があります。
タイムスタンプに関する簡単なコメント:並べ替えられたセットSCORES 小数部を必要としないものは15桁以下である必要があります。したがって、SCORE -999999999999999から999999999999999の範囲内にとどまる必要があります。注:これらの制限は、Redisサーバーが実際にスコア(フロート)をredis文字列表現として内部に保存するために存在します。
したがって、2番目の精度のためにZulu Time:-20140313122802に変換されたこの形式をお勧めします。 100msの精度で1桁を追加できますが、 if 精度を落とさないようにします。ちなみに、それはまだfloat64なので、一部のシナリオでは精度の低下は問題ないかもしれませんが、ケースは「完全な精度」の範囲に収まるので、それをお勧めします。
データの有効期限が10年以内の場合は、最初の3桁(CCYのCCY)をスキップして、.0001秒の精度を実現することもできます。
ここでは負のスコアを提案します。これにより、より単純なZRANGEBYSCOREを使用できます。 REVの代わりに 1。 -infを使用できます 開始スコア(マイナス無限大)およびLIMIT 0 100 上位100件の結果を取得します。
2つのソートされたセットmembers (または'keys' ただし、並べ替えられたセット自体もキーであるため、これはあいまいです) scoreを共有できます 、それは問題ありません、同じscore内の結果 アルファベット順です。
これがお役に立てば幸いです、TW
チャット後に編集
OPはデータを収集したいと考えていました(ZSETを使用) )異なるキーから(GET / SET またはHGET / HSET キー)。 JOIN ZRANGEBYSCORE これを行うための好ましい方法は、単純なLuaスクリプトです。 Luaスクリプトはサーバー上で実行されます。以下の例では、EVALを使用しています 簡単にするために、本番環境ではSCRIPT EXISTSを使用します 、SCRIPT LOAD およびEVALSHA 。ほとんどのクライアントライブラリには簿記ロジックが組み込まれているため、毎回スクリプトをアップロードする必要はありません。
これがexample.luaです :
local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
r[i]=a[i+1]
r[i+1]=redis.call('get', a[i])
end
return r
このように使用します(生の例、パフォーマンス用にコーディングされていません) :
redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2
redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100
結果:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"