3

ソートされたセットとredisのリストのスペースの違いは何ですか?私の推測では、ソートされたセットはある種の平衡二分木であり、リストはリンクリストです。つまり、キー、スコア、値のそれぞれについてエンコードしている3つの値に加えて、リンクリストのスコアと値をまとめますが、オーバーヘッドは、リンクリストが1つを追跡する必要があることです。他のノードであり、バイナリツリーは2つを追跡する必要があるため、ソートされたセットを使用するためのスペースオーバーヘッドはO(N)です。

私の値とスコアが両方ともlongであり、他のノードへのポインターもlongである場合、単一ノードのスペースオーバーヘッドは64ビットコンピューターで3longから4longになり、33%になるようです。スペースの増加。

これは本当ですか?

4

1 に答える 1

5

それはあなたの見積もりをはるかに超えています。ziplistが使用されていない(つまり、かなりの数のアイテムがある)としましょう。

Redisリストは、従来の二重リンクリストです。アイテムごとに3つのポインター(prev、next、value)があります。

ソートされたセットは、辞書とスキップリストです。辞書には、アイテムも3つのポインター(key、value、next)とともに格納されます。スキップリストのメモリフットプリントは、評価がより複雑です。各ノードは、1つのdouble(スコア)、2つのポインター(obj、backward)、およびnが1〜32のnのカップル(pointer、span value)を取ります。ほとんどのアイテムは1つしか取りません。または2組のカップル。

つまり、zipリストとして表されていない場合、ソートされたセットは、最もオーバーヘッドの多いRedisデータ構造になります。リストと比較すると、メモリのオーバーヘッドは200%以上(つまり3倍)です。

注:Redisでメモリ消費量を評価する最良の方法は、疑似データを使用して大きなリストまたは並べ替えられたセットを作成し、INFOを使用してメモリフットプリントを取得することです。

于 2012-09-04T22:08:55.243 に答える