ZRANGEBYLEX commandのドキュメントセクションには、次の情報があります。順序付けされたストアキーがスコア0のセットである場合、後のキーは辞書順に取り出すことができます。そして、ZRANGEBYLEX操作の複雑さはO(log(N)+M)
になります。ここで、Nは総要素数、Mは結果セットサイズです。ドキュメンテーションには文字列の比較に関する情報がありますが、要素が格納される構造については何も教えていません。Redis ZRANGEBYLEXコマンドの複雑さ
しかし、いくつかの実験とsource codeの読み込みの後、ziplist
のすべての要素が要求と照合されると、おそらくZRANGEBYLEX操作で線形時間の検索が行われます。そうであれば、ziplist
のすべての要素がスキャンされるため、O(N)について複雑さは上記よりも大きくなります。
gdbでデバッグした後、ZRANGEBYLEXコマンドがgenericZrangebylexCommand機能で実装されていることがきれいです。制御フローはeptr = zzlFirstInLexRange(zl,&range);
に続きますので、要素検索の主要な作業はzzlFirstInLexRange関数で実行されます。すべての命名規則およびそれに続く制御フローは、ziplist
構造が使用され、入力オペランドとのすべての比較が要素ごとに順次行われるとみなされます。
よく知られているキーをredisストアに挿入した後で解析してメモリを検査すると、ZSET要素は実際にziplist
バイトに比較され、gaugeで確認されているようです。
so 質問 - ドキュメントが間違っていて、線形のものが現れる場合の対数的複雑さをどのように伝播できますか?あるいは、ZRANGEBYLEXコマンドが少し違うのでしょうか?前もって感謝します。
ありがとう、とても便利でした!残念ながら、ZRANGEBYLEXは異なるスコアでは動作しません。 –