はい、ソートされたセットは非常に高速で強力です。 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"