1

私はredis2.6を使用しています。ZRANGEBYSCORE関数の奇妙な動作に直面しました。約数百万要素の長さのソート済みセットがあります。このようなもの:

10 marry 
15 john 
25 bob 
...

したがって、クエリと比較してください。

ZRANGEBYSCORE longset 25 50 LIMIT 0 20  works like a charm, it takes milliseconds
ZRANGEBYSCORE longset 25 50             this one hangs up for a minutes!! 

私が興味を持っているすべての要素は、セットの最初の 100 にあります。SORTED セットなので重みが「50」以上の要素をスキャンする必要はないと思います。

redis がソートされたセットをスキャンする方法と、これら 2 つのクエリに大きな違いがある理由を説明してください。

4

1 に答える 1

5

Redis の最も優れた点の 1 つである IMO は、ドキュメント内の各コマンドの時間の複雑さを確認できることです。zrangebyscoreのドキュメントでは、次のように指定されています。

時間計算量: O(log(N)+M) (N は並べ替えられたセット内の要素の数、M は返される要素の数)。M が定数の場合 (たとえば、LIMIT で常に最初の 10 個の要素を要求する場合)、O(log(N)) と見なすことができます。

[...]

が大きい場合、返される要素に到達する前にoffset、並べ替えられたセットを要素に対してトラバースする必要があることに注意してください。これにより、合計でO(N)時間の複雑さが生じる可能性があります。offset

これは、特定の数のアイテムのみが必要であることがわかっている場合に を指定しLIMIT offset countoffsetis (close to)の場合はO(log(N))0と見なすことができますが、返されるアイテムの数が多い場合 (またはオフセットが大きい場合)、 O(N)と見なすことができます。

于 2012-09-21T16:03:28.137 に答える