詳細Redisのに入るデータの5種類

公共の数のオリジナル記事:猿周Xiansenプログラム。このプラットフォームは、私の記事のように、私はマイクロチャンネル公衆番号への関心を歓迎し、定期的に更新されていません。
ファイル

言及した記事、Redisの5つの最も頻繁に使用されるデータの種類があります:文字列、リスト、ハッシュ、設定 、SortSetが。記事では、単純にそれぞれ解析するコマンドを指示し、一般的なシナリオへの5つのデータ型の使用は、この記事では、基礎となる一般的な操作の約5データ型の種類とそれぞれのデータ構造をお話しますについて説明します。Redisのは、キー・バリューインメモリデータベースの中で最も人気のあるタイプとして、データベース操作だけでなく、メモリ内に、定期的にディスクに永続データすることができ、それは多くの高パフォーマンスのデータベースでは比較的一般的であり、Redisの中、各実際の値redisObjectが表される構造に基づいている:
typedefは構造体{redisObject
unsigned型:. 4、
符号なしエンコーディング:. 4;
ボイド* PTR;
INT参照カウント、
符号なしLRU:
}
我々は、これらのパラメータの意味を見ることができています。

  • タイプ:オブジェクトのデータ型は、一般的には、5つのデータタイプです。

  • エンコード:redisObjectタイプ主にシンプルな動的な文字列、リスト、辞書、ジャンプテーブル、整数および圧縮のリストをコーディング、コードの基礎となる目的を達成します。

  • *のPtr:基礎となるデータ構造への実装ポインタを指します。

  • 参照カウント:参照オブジェクトがリリースされると、カウンタは、カウント値が0です。

  • LRU:最後にこのオブジェクトを訪問しました。

Stringデータ型

Stringデータ構造はキーと値の単純型、Redisのは、データの最も一般的に使用されるタイプであり、値は文字列または数であってもよいです。文字列データが実際に格納されている文字列、浮動小数点値の3つの異なるタイプの整数を入力し、自動的にどのようにRedisの文字列、整数、3つの異なるタイプの浮動小数点値を識別行われます。RedisのはCで実装されますが、Cの文字列を使用していない、彼自身が実際にSDS交換するString型の構造を実装しているのRedis:
構造体sdshdr {
//レコードの配列を使用bufのバイト長
のint lenです。
// BUFアレイ内の残りの空間のレコード長
INT無料;
の文字列格納する//バイト配列、
[] BUFチャー;
};

私たちは、自由パラメータが残っている利用可能なスペースの長さを決定するために使用され、lenは各文字BUFと「\ 0」に格納されている文字列の末尾、文字列の長さを示していることがわかります。なぜRedisのは、彼らのSDS構造、それを達成するために?SDSので構造は、いくつかの利点があります。

  • 由于len保存了当前字符串的实际长度,所以获取长度时间复杂度为O(1)。
  • SDS在拼接之前会对当前字符串的空间进行自动调整和扩展,防止当前字符串数据溢出。
  • 减少内存分配次数,SDS拼接字符串发生时,如果此时的字符串长度len小于1M,则SDS会分配和len大小相同的未使用空间给free,如果此时的字符串长度len大于1M,则SDS会分配和1M的未使用空间给free,当字符串缩短时,缩短的空间会叠加到free中,用于后续的拼接使用。

文字列データは、一般的に使用されるコマンドを入力します。

  • 一般的に使用されるコマンド:ように設定し、取得、DECR、INCR、MGETと。

Stringデータ型アプリケーションのシナリオ:

  • 分散ロック

  • 分散セッション:セッションはRedisの中に分散アプリケーションに保存されています

  • コモディティは、スパイク

  • 一般的な数:ブログの数、読み取り数

リストデータタイプ
リストデータ構造を文字列の順序付けられた複数格納するために使用され、各列は、リストの要素となり、Redisので、ノードリスト再配列および順次アクセス・ノードへの機能を提供、リストを終了することができプッシュとポップの要素が、あなたはまた、範囲を指定した要素のリストを取得する二つの方法で実装取得し、他の要素指定されたインデックスで、メインzipListのリストデータ構造(圧縮リスト)とLinkedListの(二重リンクリスト)をターゲットにすることができます。まず、LinkedListの構造を見ることができる:
式リスト構造体{
//ヘッダノード
listnodeのヘッド;
//テーブルテイルノード
listnodeの
尾、
ノードの合計数が//含まれる
符号なしのロングLENを;
};

各ヘッダ含むLinkedListのノードに見られるのヘッドノードとテールテールは、LinkedListの中に、各ノードが有する前部要素、ならびに前のポイントを各ノード、ポイントの後の次の要素を値は、ノードの値です。二重リンクリストを達成するために、実際には、理解し、Cにする二重にリンクされたリストは、類似度が大きいです。そして他方は幾分かの方法の配列に類似するが、少し矛盾アレイ連続実装zipListメモリ実装に基づくzipListが一致しないことが、各エントリのサイズ、溶液を制御するための特別な方法が必要であるが、プッシュの実装では、ポップ操作データの移行が存在することになる場合、時間計算量はO(N)、一般にあまりzipList要素は、我々はzipListの構造を見ることができる場合にのみ使用されます。

構造体{ziplistタイプ
//圧縮全体リストのバイト数
のuint32_tのzlbytes、
圧縮された尾を記録ヘッドノード//のノードのリストのバイト数は、直接ノードのアドレスを見つけることができる
のuint32_tのzltail_offsetを;
//ノードの数、種々の記録タイプ、デフォルトでは以下の
uint16_t zllengthを;
//ノード
リストentryX;
}

各ノードにおけるzipListは、以下のパラメータ情報を有しています。

  • previous_entry_length:ノードを記録する前にバイト長

  • コンテンツ:ノードに格納されたコンテンツは、バイト配列または整数とすることができます

  • エンコーディング:コンテンツ属性タイプと長さに記憶された記録データ

***シーンの一覧データ型**

データタイプの記事一覧のリストをレンダリングするとき、各ユーザーは、一般的にあなたが記事の一覧を表示する必要がある場合、あなたはリストのデータ型を使用することができ、出版された論文の独自のリストを持っていますし、記事のインデックス範囲に応じて問い合わせをしないようにだけ注文することができます使用することができますリスト。

データ型を設定します。

一覧データ型とデータ型がやや似ている設定し、また、複数の要素を保存するために使用されるが、最大の違いは、セットポイントデータ型が重複要素が現れ許可していない、と要素のセットが乱れているということであり、我々はリストにあったことができますインデックスインデックスで要素を得るようなものが、複数のタイプをサポートするが、交差点、労働組合、違い、とても合理的な利用セットのデータ型を取るためにセットを設定し、実際のプロジェクトの開発に多くの問題を解決することができます。INTSETとハッシュテーブル:設定したデータは、データ構造の2種類があります。まず、INTSETの構造を見てみましょう。

構造体{INTSETのtypedef
//エンコード
; encondingのuint32_t
集合の要素数が//含ま
のuint32_t長;
//配列要素を保存し
、[]の内容int8_t
INTSET}。

コレクション内のすべての要素を設定しますが整数である場合には、RedisのはINTSETデータ構造を使用します。INTSETデータ構造を整えている:あるに特に注意を払うことが重要です。消費性能を低下させるための要素の順序を制御しながらプッシュ要素があるとしたときにバイナリサーチアルゴリズムを使用できるようにRedisのセットは、ダイナミックアレイ構造の使用に基づく、整数要素の集合であるにおいて、ため時間計算量はO(logN個)となるように、操作要素をプッシュとポップ。コレクションを設定して非整数データ要素がある場合はハッシュテーブルの、キーは常にnullになるように、Redisのは、自動的に、格納された値と値なし、ハッシュテーブルのキー値だけ、データを格納するハッシュテーブルのデータ構造を使用します。 。私たちは、ハッシュテーブルの構造を見ることができます。

構造体{辞書のtypedef
//タイプ特異的機能
dictType *タイプ;
// 2つのハッシュテーブル、リアルタイム保管するための1つ、焼き直しのための1つの
dicthtのHT [2];
//データ移行インデックスを使用して焼き直し
符号なしrehashidxを;
}

設定したデータ型の使用シナリオ:

  • ユニークな値を記録します。たとえば、IPをログに記録し、ID番号

  • タグをし、ユーザ嗜好データのコンピューティング度を設定し、通過することができる:タグを追加します。

ハッシュデータ型
Redisのハッシュタイプでは、キー自体が構造体への鍵であり、我々は、オブジェクトを呼んで、オブジェクトを格納するために使用されるので、ハッシュデータ型が最も適切なデータ型です。ハッシュデータ型符号化はzipListまたはハッシュテーブルであってもよいです。ときに、すべてのオブジェクトが64バイト未満のハッシュキーに格納されている未満512の要素の数はzipList、そうでない場合はハッシュテーブルを使用した場合。リストzipListデータは基本的に同じだけ述べzipList事実を入力し、唯一の違いは、ストレージ・ハッシュ・エントリのペアの数を増加させるので、特定の長さは2の整数倍であることです。データのみの少量のみが許容される場合におけるようもちろん、zipListを使用すると、O(N)のプッシュとポップ時間複雑性を述べています。辞書、dictht、エントリー:実際には、HashtableにJavaのハッシュテーブルと少し似て、HashTTableは、3つの主要な構造に依存しています。この図は、次のような関係3つの構造を表すことができます。
ファイル

ハッシュデータタイプ該当シーン:

  • ストレージオブジェクトデータ。

  • JSONは、オブジェクトのコレクションに関連して説明しました。

SortSetデータ型

セット順序集合がコレクションに基づいて、コレクション内のSortSet要素は、SortSetリストはソートやインデックスをソートする指標として用いることができるソートソートすることができ、保持特性は、コレクションに設定して要素を複製することはできませんが、違いがあります基礎、SortSetは2つだけのコレクションのための秩序や鍵データを達成するように、SortSetデータ構造:zipListとskipList +ハッシュテーブル、zipListは、デフォルトのソートをあまり持っていない、とするときより少ないデータを使用しています小規模から大規模までの要素。データ構造skipList +ハッシュテーブルの使用は、skiplist最適範囲は、ソート、検索の複雑さの場合に設定された時間は、ハッシュテーブルはすでにプッシュとポップの要素の時間の複雑さを最適化することができる言及していることを保証します。skipList順序付けられたリストをもとに、あなたは、マルチレイヤインデックス、練習時間の複雑さと引き換えに、空間的な複雑さの実現、そして最終的に時間複雑であるクエリ処理のO(logN個)の要素、あなたはポップの要素を押したりする必要がある、使用を作成することができますハッシュテーブルは、時間の複雑さを実現するO(1)です。

シーンのSortSetデータ型

  • スコアボード:よるとポイントはソート昇順

  • データ収集の範囲:試験80-100のデータポイント

プログラマー周Xiansen:国民の関心番号へようこそ
ファイル

おすすめ

転載: www.cnblogs.com/niyueling/p/11586289.html