Tair(Redis OSS-compatible) を使用して、低レイテンシで、大量のトラフィックに耐えることができるライブストリーミングチャネル情報システムを構築できます。
背景情報
ライブストリーミングチャネルは、ライブストリーミングシステムのコアコンポーネントの1つとして機能します。 ライブストリーミングウィンドウを除いて、ライブユーザー、仮想ギフト、コメント、いいね、リーダーボード、およびライブストリーミング中に生成される他のデータは、時間に制限があり、高度にインタラクティブで、遅延に敏感です。 Redisキャッシュサービスは、このようなデータを処理するのに適したソリューションです。
このトピックのベストプラクティスでは、Tair(Redis OSS-compatible) を使用してライブストリーミングチャネル情報システムを構築する方法を示します。 このトピックでは、3種類の情報のライブストリーミングチャネル情報システムを構築する方法について説明します。
リアルタイムランキング情報
カウント情報
タイムライン情報
リアルタイムランキング情報
リアルタイムランキング情報には、オンラインユーザーリスト、仮想ギフトのランキング、ライブコメントが含まれます。 ライブコメントは、メッセージがリーダーボード形式で表示されるのと同様に整理およびランク付けできます。 Redisのソートされたセット構造は、リアルタイムのランキング情報を格納するのに適しています。
Redisセットはハッシュテーブルに保存されます。 作成、読み取り、更新、および削除 (CRUD) 操作の時間の複雑さはO(1) です。 ソートされたセットの各メンバーは、ソートなどの操作を容易にするためにスコアに関連付けられます。 次の例は、ソートされたセットがライブストリーミングチャネル情報システムを構築する方法を示しています。 この例では、追加および返されたライブコメントが使用されます。
user55ライブストリーミングチャネルの最後の5つのライブコメントを記録するには、スコア形式としてunix timestamp + ミリ秒を使用します。
redis> ZADD user55:_danmu 1523959031601166 message111111111111 (integer) 1 11.160.24.14:3003> ZADD user55:_danmu 1523959031601266 message222222222222 (integer) 1 11.160.24.14:3003> ZADD user55:_danmu 1523959088894232 message33333 (integer) 1 11.160.24.14:3003> ZADD user55:_danmu 1523959090390160 message444444 (integer) 1 11.160.24.14:3003> ZADD user55:_danmu 1523959092951218 message5555 (integer) 1
最後の3つのライブコメントを返します。
redis> ZREVRANGEBYSCORE user55:_danmu +inf -inf LIMIT 0 3 1) "message5555" 2) "message444444" 3) "message33333"
指定された期間内に3つのライブコメントを返します。
redis> ZREVRANGEBYSCORE user55:_danmu 1523959088894232 -inf LIMIT 0 3 1) "message33333" 2) "message222222222222" 3) "message111111111111"
カウント情報
ユーザー関連データの場合、カウント情報には未読メッセージ、フォロワー、ファンの数、経験値が含まれます。 Redisのハッシュ構造は、このタイプのデータを格納するのに適しています。 たとえば、フォロワー数は次のように処理できます。
redis> HSET user:55 follower 5
(integer) 1
redis> HINCRBY user:55 follower 1 //Number of followers + 1
(integer) 6
redis> HGETALL user:55
1) "follower"
2) "6"
タイムライン情報
タイムライン情報は、時系列でソートされた情報のリストです。 タイムライン情報には、アンカーモーメントと新しい投稿が含まれます。 このタイプの情報は、固定された時系列順に配置され、Redisリストまたは順序付きリストを使用して格納することができます。 例:
redis> LPUSH user:55_recent_activity '{datetime:201804112010,type:publish,title: The show starts, content: Come on}'
(integer) 1
redis> LPUSH user:55_recent_activity '{datetime:201804131910,type:publish,title: Ask for a leave, content: Sorry, I have plans today.}'
(integer) 2
redis> LRANGE user:55_recent_activitiy 0 10
1) "{datetime:201804131910,type:publish,title:\xe8\xaf\xb7\xe5\x81\x87\",content:\xe6\x8a\xb1\xe6\xad\x89\xef\xbc\x8c\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x9c\x89\xe4\xba\x8b\xe9\xb8\xbd\xe4\xb8\x80\xe5\xa4\xa9}"
2) "{datetime:201804112010,type:publish,title:\xe5\xbc\x80\xe6\x92\xad\xe5\x95\xa6,content:\xe5\x8a\xa0\xe6\xb2\xb9}"
関連資料
ライブストリーミングシステムのホットキーをクエリする方法の詳細については、「リアルタイムキー統計機能の使用」をご参照ください。
オフラインキー分析を使用してワークロードの潜在的なリスクを排除し、パフォーマンスのボトルネックを特定する方法の詳細については、「オフラインキー分析機能の使用」をご参照ください。
高い同時実行性を処理する方法の詳細については、「クラスターマスターレプリカインスタンス」をご参照ください。