[TOC]
Redisのデータ構造と内部構造
redisには5つのデータ構造があり、内部で保存される際にはそれぞれ異なるデータ構造として実装されます:
redisはデータ構造の内部構造を表示します。
redisでは、キーの内部構造を照会るコマンドはObjectです。
このコマンドは公式サイトから入手できます: OBJECT ENCODING key
また、公式サイトにはデータ構造と内部構造の対応表も掲載されています:
String -- int
== 数字
文字列が64ビット符号なしシェーピングに変換できる数値を格納している場合は、このように格納されます。
数字が大きすぎて64ビットに収まらない場合は?
このプロセスは可逆的です。
String -- embstr
== 短い文字列
String--intでは、文字列が数値に変換可能で、その長さが64ビット以下であればintを使って格納し、数値に変換可能で64ビットより大きければrawを使って格納する、と理解されています。では、数値に変換できず、64ビット以下の場合はどうでしょうか?
64ビットを超えると、rawにアップグレードされます。
64ビット以下の場合、embstrにダウングレードされます。
String -- raw
== 長い文字列
文字列の長さが64ビット以上の場合はrawを、64ビット以下の場合は数値に変換できる場合はintを、数値に変換できない場合はembstrを使用します。
List -- quickList
== クイックリスト
redisの最新バージョンでは、リストはすべてquickListを使っています。
List -- zipList
== 圧縮リスト ==
これはredisの公式サイトに掲載されているものです:
== しかし、redisの最新バージョンでは、Listが公式サイトの説明と一致しません。==
List -- linkedList
==連鎖リスト
一般的に、データを格納するにはlinkedListを使用します。
== しかし、redisの最新バージョンでは、Listが公式サイトの説明と一致しません。==
List -- zipList
== 圧縮リスト ==
ハッシュ型の要素数がhash-max-ziplist-entries設定より少なく、すべての値がhash-max-ziplist-value設定より少ない場合、Redisはハッシュの内部実装としてziplistを使用します。 ziplistはよりコンパクトな構造を使用して複数の要素の連続した格納を実現するため、メモリ節約の点でhashtableよりはるかに優れています。ハッシュテーブルよりもメモリを節約できます。
構造のアップグレード: zipList の hashTable へのアップグレード
== 不可逆的 ==
List -- linkedList
== ハッシュテーブル ==
ハッシュ型がziplistの条件を満たせない場合、Redisはハッシュの内部実装としてhashtableを使用します。なぜなら、このときziplistの読み取りと書き込みの効率は低下し、hashtableの読み取りと書き込みの時間複雑度はO(1)になるからです。
Set -- intSet
== フィギュアのコレクション
集合の要素が数値に変換でき、その数値が小さい場合は intSet を使用します。
要素数が少ないのに、存在感を数値に変換できない場合は?== ハッシュテーブルに変換 ==
そして、アップグレードのプロセスは不可逆的です。
Set -- hashTable
== ハッシュテーブル ==
セット内の要素が多く、数値に変換できない要素がある場合は、ハッシュテーブルが使用されます。
List -- zipList
== 圧縮テーブル ==
順序付きセットの要素数がzset-max-ziplist-entries設定より少なく、各要素の値がzset-max-ziplist-value設定より少ない場合、Redisはziplistを順序付きセットの内部実装として使用します。
構造のアップグレード: zipList => skipList
エスカレーションは可逆的
Sorted Set -- skipList
==テーブルをスキップ
ziplistの条件が満たされない場合、順序付きコレクションは内部実装としてskiplistを使用します。




