ホームページ >データベース >Redis >Redisでページングを行う方法

Redisでページングを行う方法

(*-*)浩
(*-*)浩オリジナル
2019-11-21 09:20:114146ブラウズ

Redisでページングを行う方法

各トピックのユーザー コメントがまとめられて Redis に書き込まれます。各トピックには topicId があり、各コメントは topicId に関連付けられます。概算データ モデルは次のとおりです。次のように: (推奨される学習: Redis ビデオ チュートリアル )

{ topicId: 'xxxxxxxx', comments: [ { username: 'niuniu', createDate: 1447747334791, content: '在Redis中分页', commentId: 'xxxxxxx', reply: [ { content: 'yyyyyy' username: 'niuniu' }, ... ] }, ... ]}

MySQL からコメント データをクエリし、それをアセンブルして Redis に保存した後、Redis からアセンブリを取得できます。上記のデータ モデルからわかるように、データはすべてキーと値のデータであり、ハッシュを使用して保存する必要がありますが、コメント データを取得するたびに、コメント データを取得する必要があります。 createDate フィールドによってページングおよびソートされます。ハッシュは次である必要があります。ページングとソートはできません。

それでは、Redis でサポートされているデータ型を 1 つずつ見てみましょう:

1. String: 主に文字列を格納するために使用され、明らかにサポートされていませんページングと並べ替え。

2. ハッシュ: 主にキーと値のデータを保存するために使用されます。コメント モデルはすべてキーと値のデータであるため、ここでは間違いなくハッシュが使用されます。

3. List: 主にリストの保存に使用されます。リスト内の各要素は要素が挿入された順序で保存されます。コメント モデルを createDate でソートしてから List に挿入すると、 ListのLRANGEキーstart stopコマンドを使うとソートもでき、ページングもできるようです。

そうですね、ここのリストはページングと並べ替えの要件を満たしているようですが、コメントは依然として削除されるため、Redis 内のデータを更新する必要があります。コメントが削除されるたびに、データはRedis 内のすべてのデータが削除されます。一度すべてのデータを書き換えるのは明らかに洗練されておらず、効率が大幅に低下します。指定されたデータを削除できれば間違いなく優れています。リスト内のデータの削除に関係する命令は、LPOP の 2 つだけです。とRPOPはありますが、LPOPとRPOPはリストの先頭と末尾のデータのみ削除でき、指定した位置のデータは削除できません(注:実際には削除できるLREMコマンドもありますが、また、インターフェースへの同時アクセスが多い場合、このリストは無制限に拡張される可能性があり、データの重複が多くなり、通常の業務に影響を与えるため、リストは適していません。

4. セット: 主に、注文されていないセット、注文されていないセットを保管します。除外します。

5. SortedSet: 主に順序付きセットを格納します。SortedSet の要素追加命令 ZADD キー スコア メンバー [[スコア, メンバー]...] は、追加された各要素メンバーにソート用の値スコアをバインドします。スコア値のサイズに従って要素を並べ替えます。ここでは、並べ替えのスコアとして createDate を使用できます。

SortedSet の命令 ZREVRANGE key start stop は、指定された範囲内のメンバーを返すことができ、ページングに使用できます。SortedSet の命令 ZREM key member は、キーに従って指定されたメンバーを削除できます。コメントで要求されているように、ここでは SortedSet が最適です (時間計算量 O(log(N)))。

したがって、使用する必要があるデータ型は SortSet と Hash です。SortSet はページングの並べ替えに使用され、Hash は特定のキーと値のペアのデータを格納するために使用されます。 SortSet 構造では、各トピックの topicId がセットのキーとして使用され、トピックに関連付けられたコメントの createDate と commentId がそれぞれスコアとセットのメンバーとして使用されます。 createDate のサイズに応じて。

特定のトピックの特定のページのコメントをクエリする必要がある場合、コマンド zrevrange topicId (page-1)×10 (page-1)×10 perPage を通じてトピックの topicId を使用できます。これにより、トピックの下のページ上のすべてのコメントの特定の commitId を時系列で確認できます。 page はクエリ ページのページ番号、perPage は各ページに表示されるアイテムの数です。

すべてのコメントの commentId を見つけた後、これらの commentId をキーとして使用して、ハッシュ構造内のコメントに対応するコンテンツをクエリできます。

このように、SortSet と Hash の 2 つの構造は、Redis でのページングとソートの目的を達成するために使用されます。

もちろん、Hash 型の代わりに SrotedSet 型のみを直接使用して、コメントをメンバーに直接格納することもできます。

しかし、なぜコメントを入れたり、さまざまな種類に分類したりするのでしょうか?利点は、時間による正と負の順序、いいね! による正と負の順序、閲覧数による正と負の順序など、コメントのさまざまな並べ替えタイプを設定できることです。この方法では、異なる SrotedSet の並べ替えを維持するだけでよく、複数のコメント セットの内容を維持する必要はありません。

以上がRedisでページングを行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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