比如说有一个微博的TID是1。 UID为1,2,3,4,5,6,7,8,9的用户都给这个微博点赞了。用redis缓存框架存储的话如何存储。微博可能有几十万个。如果用
key->set(value) 这种形式的话 key是微博ID的标示 value是 [1,2,3,4,5,6,7,8,9]这种形式,这样的话有多少个微博就有多少个K-V存储。我想知道这样会有什么弊端吗?或者有什么更好的方法吗?
走同样的路,发现不同的人生
複数の HashSet ストレージを使用できます。各 Weibo は HashSet のサブキーにすぎません。 HIncrBy コマンドを使用すると、「いいね!」の数を増やすことができます。各 HashSet のキーが 100 を超えないように、TID をブロックに分割します。公式ドキュメントには、HashSet は内部要素が 100 未満の場合に線形ストレージとスキャンを使用するため、同じデータ スケールのツリー構造と比較して効率的でメモリの節約になると記載されています。
例: TID 123456的微博存在z:1234 の HashSet では、そのキーは 56 です。最新の Weibo も非常にアクティブであると仮定すると、ほとんどの場合、少数の HashSet しか呼び出されず、これは CPU キャッシュに非常に優しいです。
123456
z:1234
気に入ったユーザーを管理したい場合は、データ形式をカスタマイズできます。ユーザーの数が少ない場合は、ユーザー リスト全体を HashSet の値フィールドに埋め込みます。たとえば、ユーザーが 50 人を超えた場合は、ユーザーを Set に分割し、Set のキーを HashSet に保存します。例:
ほとんどの Weibo ユーザーは「いいね」の数が少ないため、HashSet は多くのグローバル スペース キーを節約できます (グローバル キーは HashSet キーより多くのメモリを消費します)。
@ 下着を販売してオンラインにアクセスするについての答え: インプレースクイックソートが使用されている場合、50 ユーザーの手動ソート効率は非常に高くなります。これは、このデータ規模では、データのコンパクトなストレージによってもたらされるキャッシュの使いやすさが、手動ソートと比較して Redis ZSet によってもたらされる改善よりもはるかに優れているためです。気に入ったユーザーが昇格すると、アルゴリズムの時間計算量を確保するために set または zset に自動的に適応します。それでも効率が心配な場合は、ソートされた UID リストを HashSet 内の値に書き戻し、将来データに変更がない場合はそれを直接使用できます。
set と zset のどちらを使用するかは、投稿者のニーズによって異なります。 set へのメンバーの追加の複雑さは O(1)、zset への追加の複雑さは O(log N) ですが、set には並べ替え機能がありません。
LS がデータのようなものを保存するために HASH を使用することはお勧めできません。 (必要な場合は必要だと思います) 並べ替える方法がないためです。
それでは、また投稿してください!!!
NOSQL などのデータベースを使用して Weibo などのデータを保存する必要がある場合は、次のように保存できます:)。
追記、Weibo のコメントも同様の方法で保存されます。たとえば、$redis KEYS の名前に同意するだけです。 c:<コメントID> Weiboデータと関連付けるには次のようにします:
t:$tid:comments:scores (ZSET タイムマップ コメント ID);
各 uid を保存する必要がありますか、それともこれが新浪微博のやり方だと思いますか?ほとんどの場合、誰もが数値のみに注目します。この場合は、数値を使用して {tid->count} を保存します
保存する必要がある場合は、{tid->set(uid)} を使用して保存することをお勧めします
最適化とは、しきい値を設定できることです。たとえば、100 人以上が気に入った場合は、何も追加せず、数値のみを追加します (もちろん、別の {tid-> を保存する必要があります)。カウント}) 。 Weibo には 10,000 件以上の「いいね!」があるため、「いいね!」をした人全員を 1 つずつクリックする人はいません。 。
複数の HashSet ストレージを使用できます。各 Weibo は HashSet のサブキーにすぎません。 HIncrBy コマンドを使用すると、「いいね!」の数を増やすことができます。各 HashSet のキーが 100 を超えないように、TID をブロックに分割します。公式ドキュメントには、HashSet は内部要素が 100 未満の場合に線形ストレージとスキャンを使用するため、同じデータ スケールのツリー構造と比較して効率的でメモリの節約になると記載されています。
例: TID
123456
的微博存在z:1234
の HashSet では、そのキーは 56 です。最新の Weibo も非常にアクティブであると仮定すると、ほとんどの場合、少数の HashSet しか呼び出されず、これは CPU キャッシュに非常に優しいです。気に入ったユーザーを管理したい場合は、データ形式をカスタマイズできます。ユーザーの数が少ない場合は、ユーザー リスト全体を HashSet の値フィールドに埋め込みます。たとえば、ユーザーが 50 人を超えた場合は、ユーザーを Set に分割し、Set のキーを HashSet に保存します。例:
リーリーほとんどの Weibo ユーザーは「いいね」の数が少ないため、HashSet は多くのグローバル スペース キーを節約できます (グローバル キーは HashSet キーより多くのメモリを消費します)。
@ 下着を販売してオンラインにアクセスするについての答え:
インプレースクイックソートが使用されている場合、50 ユーザーの手動ソート効率は非常に高くなります。これは、このデータ規模では、データのコンパクトなストレージによってもたらされるキャッシュの使いやすさが、手動ソートと比較して Redis ZSet によってもたらされる改善よりもはるかに優れているためです。気に入ったユーザーが昇格すると、アルゴリズムの時間計算量を確保するために set または zset に自動的に適応します。それでも効率が心配な場合は、ソートされた UID リストを HashSet 内の値に書き戻し、将来データに変更がない場合はそれを直接使用できます。
set と zset のどちらを使用するかは、投稿者のニーズによって異なります。 set へのメンバーの追加の複雑さは O(1)、zset への追加の複雑さは O(log N) ですが、set には並べ替え機能がありません。
LS がデータのようなものを保存するために HASH を使用することはお勧めできません。 (必要な場合は必要だと思います) 並べ替える方法がないためです。
現時点ではこのように対応しております。それでは、また投稿してください!!!
NOSQL などのデータベースを使用して Weibo などのデータを保存する必要がある場合は、次のように保存できます:)。
リーリー追記、Weibo のコメントも同様の方法で保存されます。たとえば、$redis KEYS の名前に同意するだけです。 c:<コメントID> Weiboデータと関連付けるには次のようにします:
t:$tid:comments:scores (ZSET タイムマップ コメント ID);
データを取得するときは PIPELINE を使用するとはるかに便利です。各 uid を保存する必要がありますか、それともこれが新浪微博のやり方だと思いますか?ほとんどの場合、誰もが数値のみに注目します。この場合は、数値を使用して {tid->count} を保存します
保存する必要がある場合は、{tid->set(uid)} を使用して保存することをお勧めします
最適化とは、しきい値を設定できることです。たとえば、100 人以上が気に入った場合は、何も追加せず、数値のみを追加します (もちろん、別の {tid-> を保存する必要があります)。カウント}) 。 Weibo には 10,000 件以上の「いいね!」があるため、「いいね!」をした人全員を 1 つずつクリックする人はいません。 。