ApisaraDB for Redis を使用して、低遅延で大量のトラフィックを処理可能な放送チャンネル情報システムを構築できます。
背景情報
放送チャンネルは、ライブ放送システムの重要な機能の 1 つです。 放送ウィンドウを除き、オンラインユーザー、オンラインギフト、コメント、「いいね」、ランキング、ライブ放送で生成されるその他のデータには、時間制限があり、高度にインタラクティブでり、タイムラプスセンシティブです。 Redis キャッシュサービスは、このようなデータを処理するのに適したソリューションです。
このトピックのベストプラクティスでは、ApsaraDB for Redis を使用して放送チャンネル情報システムを構築する方法を紹介します。 このトピックでは、3 つの情報タイプの構築方法について説明します。
- リアルタイムランキング情報
- カウント情報
- タイムライン情報
リアルタイムランキング情報
リアルタイムのランキング情報には、オンラインユーザーリスト、オンラインギフトのリスト、およびライブコメントが含まれます。 ライブコメントは、メッセージディメンションに基づいて並べ替えられたメッセージランキングリストに似ています。 Redis のソートされたセット構造は、リアルタイムのランキング情報の処理に適しています。
Redis セットはハッシュテーブルに保存されます。 挿入、削除、編集、検索操作の時間の複雑さは O(1) です。 セット内の各メンバーはスコアに関連付けられ、並べ替えやその他の操作を容易にします。 次の例では、追加されたライブコメントおよび返されたライブコメントについて説明し、ソートされたセットが放送チャンネル情報システムを構築する方法を解説します。
- user55 放送チャネルの最後の 5 つのライブコメントを記録するスコアとして「unix timestamp + milliseconds」を使用します。
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 //The number of followers +1
(integer) 6
redis> HGETALL user:55
1) "follow"
2) "6"
タイムライン情報
タイムライン情報は、時間順に並べられた情報のリストです。 たとえば、放送局での出来事や新しい投稿などです。 このタイプの情報は、固定の時間順で並べられ、Redis リストまたは順序付きリストを使用して保存できます。 次に例を示します。
redis> LPUSH user:55_recent_activitiy '{datetime:201804112010,type:publish,title:The show starts, content:Come on}'
(integer) 1
redis> LPUSH user:55_recent_activitiy '{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}"
関連資料
- 潜在的なリスクを排除し、ビジネスパフォーマンスのボトルネックを特定する方法に関する詳細については、「ApsaraDB for Redis のメモリ使用量を分析する」をご参照ください。
- 高い同時並行性の扱い方法に関する詳細については、「ApsaraDB for Redis クラスターエディション」をご参照ください。