ホームページ >バックエンド開発 >PHPチュートリアル >5つのRedisデータ構造の詳細な説明

5つのRedisデータ構造の詳細な説明

小云云
小云云オリジナル
2018-03-12 15:17:485676ブラウズ

この記事では、主に 5 つの Redis データ構造について詳しく説明します。記事内の事例とコードが皆様のお役に立てれば幸いです。

2.1.1 グローバルコマンド

1 すべてのキーを表示 key*

2 キーの総数 dbsize (dbsize コマンドは、キーの総数を計算するときにすべてのキーを走査するのではなく、キーの総数を直接取得します組み込みの Redis 変数、時間の複雑さは O(1) であり、keys コマンドはすべてのキーを走査し、時間の複雑さは O(n) です。Redis が多数のキーを保存する場合、このコマンドは、オンライン環境)

3 キーが存在するかどうかを確認します キーが存在します 1 を返します、戻りません 0

4 削除キー Del キー 削除に成功したキーの数に戻ります -2 キーが存在しません 键 6 -keyデータ型構造 型キーの戻り値の型、戻りはありません なし

2.1.2 データ構造と内部エンコーディング


各データ構造には独自の内部コーディング実装があり、複数の実装があるため、Redis は適切なものを選択しますたとえば、各データ構造には、適切なシナリオがあります。第 2 に、複数の内部コーディング実装は、さまざまなシナリオでそれぞれの利点を発揮できます。たとえば、ziplist はメモリを節約しますが、リスト要素が多いとパフォーマンスが低下します。このとき、Redis は設定オプションに従ってリスト型の内部実装をリンクリストに変換します。


2.1.3 シングルスレッドアーキテクチャ。 redis単一の読み取りアーキテクチャとI/Oマルチプレックスモデルは、高性能のデータベースサービスを実装するために使用されますメモリの応答時間は約 100 ナノ秒であり、これは Redis が 1 秒あたり 10,000 レベルのアクセスを達成するための重要な基盤です。Redis は、I/O 多重化テクノロジの実装として epoll を使用します。 Redis 独自のイベント処理モデルを使用すると、epoll での接続、読み取り、書き込み、終了がイベントに変換され、競合によるネットワーク I/O 消費に多くの時間を浪費することがなくなります

courteいくつかの利点をもたらすための1つのスレッド:最初に、シングルスレッドは、データ構造とアルゴリズムの実装を簡素化します。第 2 に、シングル スレッドにより、スレッドの切り替えや競合状態によって引き起こされる消費が回避されます。ただし、各コマンドの実行には要件があり、特定のコマンドの実行時間が長すぎる場合、Redis は高速実行シナリオのためのデータベースです。

2.2 文字 文字列 i Redis の型は、他のいくつかの型の基礎です。値は、文字列 (単純、複雑な JSON、XML)、数値 (整数、浮動小数点)、バイナリ (画像、音声、値は 512MB を超えることはできません



2.2.1 コマンド

1 共通コマンド


1 設定値 SET キー 値 秒有効期限 ミリ秒有効期限 nx | xx


setx | setxx




アプリケーションシナリオ: Redis はシングルスレッドのコマンド処理メカニズムであるため、複数のクライアントが setnx キー値を同時に実行した場合、特性に応じて 1 つのクライアントのみが正常に設定できます。分散ロックの実装ソリューションとして使用できます


値の取得キーが存在せず、nil を返します


3 値の mset キーの値を設定しますバッチ処理の効率は向上しますが、コマンドが制御されないわけではないことに注意してください。多くは Redis のブロックやネットワークの輻輳を引き起こします。 5 カウント増加キー

値は整数ではないため、エラーが返されます

値が 0 であるため、存在キーの結果は存在しません。 1

と DECR (自己減少)、INCRBY (自己増加指定数値)、DECRBY 浮動小数点数の加算)

3 元の値 getset キーの値を設定して返します

4 指定位置を設定 文字セットRANGE Key Offset Value

5 文字列を取得 GetRANGE Key Start End

2.2.2 内部コーディング


文字列内の 3 種類: Int 39 ワード未満の 8 バイト セクション文字列 raw 39 バイトより大きい文字列。 Redis は、現在の値の型と長さに基づいて、どの内部エンコーディングを使用するかを決定します


2.2.3 一般的な使用シナリオ


️ 。 Redis には同時実行性をサポートする機能があるため、通常、キャッシュは読み取りと書き込みを高速化し、バックエンドの負荷を軽減する役割を果たすことができます。 3 共有セッション



4 速度制限 IP アドレス1 秒間に n 回を超えてアクセスすることはできません

2.3 ハッシュ


(笑) パフォーマンスとは、キー値自体が構造体へのキー値であることを意味します


2.3.1 コマンド

1設定値主要な開発ヒント: すべてのフィールド値を取得する必要がある場合は、HSCAN コマンドを使用できます。 ハッシュ タイプ


10 hincrby hincrby float


11 値 hstrlen キー フィールドの文字列長を計算します。 2.3.2 内部エンコード

内部エンコードには 2 つのタイプがあります:

ziplist (圧縮リスト) ハッシュ要素の数

Hashtable (ハッシュ テーブル) ハッシュ タイプが Ziplist の条件を満たさない場合に選択します。ハッシュテーブルの時間はO (1)

2.3.3 使用シーン



        

UserInfo getUserInfo(long id){
userRedisKey="user:info:"+id;
userInfoMap=redis.hgetAll(userRedisKey);
userInfoMap userInfo;

if(userInfoMap!=null){
userInfo=transferMapToUserInfo(userInfoMap);
}else{
userInfo=mysql.get(id);
redis.hmset(userRedisKey,tranferUserInfoToMap(userInfo));
redis.expire(userRedisKey,3600);
}
return userInfo;
}

             哈希类型和关系型数据库两点不同:

                1 哈希类型是稀疏的,而关系型数据库是完全结构化的

                2 关系型数据库可以做复杂的查询,而Redis去模拟关系型复杂查询开发困难,维护成本高

            三种方法缓存用户信息

                1 原声字符串类型:每个属性一个键

                    

               

                优点:简单直观,每个属性都支持更新操作

                缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以一般不会在生产环境用

               2 序列化字符串类型:将用户信息序列化后用一个键保存

        

                优点:简化编程,如果合理的使用序列化可以提高内存的使用效率

                缺点:序列化和反序列化有一定的开销,同时每次更新属性,都需要把数据取出来反序列化,更新后再序列化到Redis中

                3 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存

                优点:简单直观,如果使用合理,可以减少内存空间的使用

                缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存

    2.4 列表

        列表类型用来存储多个有序的字符串,一个列表最多存储2的32次方-1个元素,列表是一种比较灵活的数据结构,它可以灵活的充当栈和队列的角色,在实际开发上有很多应用场景

        列表有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。第二、列表中的元素可以是重复的

        2.4.1 命令

            1 添加操作

                 1.1 从右边往左插入元素 rpush key value

                 1.2 从左往右插入元素 lpush key value

                 1.3 向某个元素前或者后插入元素 linsert key before|after pivot value

                    

            2 查找

                1 获取指定范围内的元素列表 lrange key start end            

インデックスの添字には 2 つの特徴があります。1 つ目は、インデックスの添字は左から右に 0-n-1 であり、2 つ目に、lrange の end オプションにはそれ自体が含まれており、これは多くのオプションと同じではありません。プログラミング言語にはさまざまな END が含まれています

2 インデックス lindex キーのインデックスを指定する要素のリストを取得します

3 リストの長さを取得します Llen Key

3 削除右 2 RPOP Key

3 からポップアップします指定された要素を削除するリストの右側 LREM Key Count Value

4 インデックス範囲に応じて LTRIM KEY Start END

4 Modify


指定されたインデックスの要素を変更する LSET Key Index Newvalue 5 ブロック操作 BRPOP BLPOP Key Time

1 リストが空です: タイムアウト = 3 の場合、クライアントは 3 秒まで待ってすぐに戻ります

2 リストは空ではありません: クライアントはすぐに戻ります


内部には 2 つありますリスト型のエンコーディング


リスト要素の数


ziplist の条件が満たされない場合、Redis はリストの内部実装としてリンクリストを使用します。

ブロックキュー


2 記事リスト 个 2 つの質問: まず、毎回ページングして取得する記事が多い場合は、複数回のHGETALL操作を行う必要があります。この時はString型なのでmgetを使って一括で取得します。次に、ページングによって記事リストを取得する場合、lrange コマンドはリストの両端のパフォーマンスが向上しますが、リストが大きくなると、リストの中間範囲の要素を取得するパフォーマンスが低下します。 2 レベルの分割を検討できます


lpush+lpop=Stack(スタック) l Push+rpop=Queue(キュー)

lpush+rpop=Queue lpsh+ltrim=Capped Collection(限定コレクション)

+LPush+BRPOP = MESSAGE QUEUE (メッセージ クエスト)


Cathery 2.5 コレクション


コレクションは、複数の文字列要素を保存するために使用されます。リストと異なるのは、許可されていない繰り返し要素があることと、コレクション内の要素です。 2.5.1 コマンド


1 コレクション内の操作


1.1 要素sadd key elementの追加 1.2 要素の削除rem key element


1.3 要素数の計算scar key


1.4の要素はセット内にあります Sismember Key Element


1.5 指定された番号の要素にランダムに戻ります SRANDMEMEMBER Key


1.6 コレクションからランダムなポップアップ要素 SPOP Key


1.7 すべての要素を取得します Smembers Key


2 エピソード


1 もっと探す 集合の交差シンターキー... 2 複数の集合の和集合スイノンキーを求める...


3 複数の集合の差分sdiffキーを求める 4 交差、差分、和集合 結果が保存


SintersStore 宛先キー


SDIFFSTORE DESTION キー


SUIONSTORE DESTION KEY



2.5.2 内部エンコーディング


2 つの内部タイプがあります:


intSET (整数整合性セット): 要素がセット内のすべてが整数であり、要素の数が set-max-intset-entries 構成 (デフォルト 512) より少ない場合、Redis はセットの内部実装として intset を使用するため、メモリ使用量が削減されます

ハッシュテーブル (ハッシュ) table) コレクション型が intset の条件を満たせない場合、Redis はコレクションの内部実装として hashtable を使用します

2.5.3 使用シナリオ


コレクション型の典型的な適用シナリオはタグです。 Sadd tag1:users user:1 user:3


開発のヒント: ユーザーとタグ 部分的なコマンドの失敗によるデータの不整合を防ぐために、トランザクション内で関係のメンテナンスを実行する必要があります


3 ユーザーの下のタグを削除します


srem user:1:tags tag1 tag5 4 タグの下のユーザーを削除します

srem tag1:users user:1


感5 ユーザーが興味を持ったラベルを一緒に計算する Sinter User: 1 TAGS User: 2 Tags


開発ヒント: Sadd = タグ付け /srandmember= ランダムアイテム (宝くじなどの乱数を生成) sacd+sinter=ソーシャルグラフ(ソーシャルニーズ)2.6注文セット


注文セットは、sortingの基礎としてセットにスコアを追加することです。セットと比較した並べ替えフィールドですが、価格も生成されます。ZADD の時間計算量は o (log (n))、SADD の時間計算量は O (1) 计 2 メンバーの数を計算します

Scard Key


3 メンバーのスコアを計算 ZSCORE Key Member


4 メンバーのランキングを計算 Zrank Key Member

5 メンバーを削除 Zrem Key Member

6 增加成员的分数zincrby key member

7 戻り指定排名范围の成员zrange key start end


8 返指定分数范围の成员zrangebysore key min max


9 返指定分数范围成员个数zcount キー最小最大


コレクション間の操作

1 つの交差点 zinterstore の宛先numkeys キー

N 2 ZunionStore 宛先 Numkeys キー


と合わせて 2.6.2 内部エンコーディング


整然としたコレクション型には 2 つの内部コードがあります:


ziplist -ziplist-entries 設定、およびそれぞれの値がいつ要素が zset-max-ziplist-value 設定より小さい場合、Redis は ziplist を順序付きセットの内部実装として使用し、メモリ使用量を効果的に削減できます


スキップリスト) ziplist の条件が満たされない場合、順序付きセットは内部実装としてスキップリストを使用するため、この時点でジップリストの読み書き効率が低下します

2.6.3 使用シナリオ

順序付きセットの典型的な使用シナリオはランキングシステムです。たとえば、ビデオ Web サイトでは、ユーザーがアップロードしたビデオをランク付けする必要があります

数 1 ユーザーを追加 (いいね!) ZDD ユーザー: ランキング: 2016_03_15 Mike 3


Zincrby ユーザー: ランキング: 2016_03_15 mike 1


2 ユーザーのいいねをキャンセル


zrem ユーザー: 2016_03_15 mike


3 表示を取得していいね数が最も多かったユーザー 10 人

この関数は、ユーザー名をキー サフィックスとしてユーザー情報をハッシュ タイプで保存できます。ユーザーのスコアとランキングについては、zcore と zrank の 2 つの関数を使用できます。 ' s 2.7 の 2.7.

1 キーの名前変更 キーの名前変更 newkey

2 ランダム キーのランダムキーを返します

3 キーの有効期限 -1 キーには有効期限が設定されていません -2 キーは存在しません

キーの有効期限は次のとおりです秒単位のタイムスタンプ

Re 1 Expire Key のキーが存在しない場合、返される結果は 0 です

2. 有効期限が負の場合、Del Time Clear 对のためと同様に、キーはすぐに削除されます。 4 文字列型キーの場合、SET コマンドを実行すると有効期限が削除されます。


5 Redis は、セカンダリ データ構造の内部要素の有効期限機能をサポートしていません。タイプの は、有効期限を設定するために使用され、移動およびダンプ +復元を含む、移行キーのメソッドの 3 つのセットが異なります。その実装方法と使用シナリオは異なります


1 つの移動は、Redis 内のデータの移行に使用されます


‐ ‐ ソース Redis では、ダンプ コマンドはキー値をシリアル化します。形式は R DB 形式 2. ターゲット Redis 上で、復元コマンドは上記をシリアル化します。値が復元されます。ttl パラメータは有効期限を表します

E 3 Migrate コマンドは、Retis インスタンス間のデータ移行に使用されます


2.7.2 トレンド


Redis は、すべてのキーを横断するための 2 つのコマンド、Keys と SCAN


1.配 * は任意の文字の一致を表します


. 文字に一致する代表


[] は文字


を表します。 x は転送に使用されます。 ブロック


2 プログレッシブ トラバーサル



の一部のみをスキャンすると考えられます。辞書のキー辞書のすべてのキーが横断されるまでキーに対応するコマンドには、HSAN、SSCAN、ZCAN

1が含まれます。 2.8 この章の終わりの復習


関連する推奨事項:

Redis データ構造

以上が5つのRedisデータ構造の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。