Heim >Backend-Entwicklung >PHP-Tutorial >PHP+REDIS-Praxis: Analyse mehrerer Lösungen zur Zählung von Online-Personen
Das Online-Personenzählgeschäft ist eine Geschäftslogik, die wir bei der Webentwicklung entwerfen müssen. In diesem Artikel werden verschiedene Designlösungen vorgestellt, um die Vor- und Nachteile jeder Lösung zu analysieren:
Verwenden Sie geordnete Sets
Diese Lösung Es kann gespeichert werden Online-Benutzer und Benutzer-Online-Zeit gleichzeitig und können viele aggregierte Berechnungen durchführen, aber der Speicherverbrauch ist auch sehr beträchtlich.
Sets verwenden
Diese Lösung kann Online-Benutzer speichern und auch bestimmte Aggregationsberechnungen durchführen. Mit zunehmender Anzahl von Benutzern nimmt jedoch der Speicherverbrauch zu nimmt ebenfalls zu
Verwendung von Hyperloglog
Diese Lösung verbraucht 12 KB Speicher, egal wie viele Online-Benutzer gezählt werden, aber sie kann nur statistische Informationen über Online-Benutzer liefern und keine genaue Liste der Online-Benutzer erhalten
Bitmap verwenden
Diese Lösung ist besser. Sie kann den Status von Online-Benutzern aufzeichnen und gleichzeitig so viel Speicherplatz wie möglich sparen. Außerdem können bestimmte Aggregationsvorgänge ausgeführt werden.
Lassen Sie uns praktische Beispiele zur Veranschaulichung verwenden:天 每 每 Wir Erstellen Sie zunächst eine kleine Anzahl von Benutzern mit 10 W ~ 30 W pro Tag und 100 W-Benutzergruppen, um die folgenden Schemata zu veranschaulichen.
Plan 1: Verwenden Sie eine geordnete Sammlung zählen$start_time = mktime(0, 0, 0, 9, 5); //monday for ($i=0; $i < 6; $i++) { $day_start_time = $start_time + 86400 * $i; //every day begin time $day_end_time = $day_start_time + 86400; //every day end time $online_user_num = mt_rand(100000, 300000); //online user between 100000 and 300000 for ($j=1; $j < $online_user_num; $j++) { $user_id = mt_rand(1, 1000000); $redis->zadd('000|online_users_day_'.$i, mt_rand($day_start_time, $day_end_time), $user_id); } }Nicht nur diese, wir können auch den Online-Status der Benutzer morgens, mittags, nachmittags, abends und in anderen Zeiträumen zählen. Es gibt noch viele andere , Rechts? Es verbraucht nur sehr viel Speicherplatz
[Empfehlung: PHP-Video-Tutorial
]Option 2: Sammlungen verwenden
Oder kommen Sie zuerst und erfassen Sie die Daten online als Benutzer://note: 统计每天的在线总人数 for ($i=0; $i < 6; $i++) { print_r($redis->zsize('000|online_users_day_'.$i). "\n"); } //note: 统计最近6天都在线的人数 var_dump($redis->zInter('000|online_users_day_both_6', [ '000|online_users_day_0', '000|online_users_day_1', '000|online_users_day_2', '000|online_users_day_3', '000|online_users_day_4', '000|online_users_day_5' ] )); //note: 统计出近6天中共有多少上线 $redis->zunion('000|online_users_day_total_6', ['000|online_users_day_0', '000|online_users_day_1', '000|online_users_day_2', '000|online_users_day_3', '000|online_users_day_4', '000|online_users_day_5']); //note: 统计某个时间段总共在线用户 print_r($redis->zcount('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10))); //note: 统计某个时间段在线用户名单 print_r($redis->zrangebyscore('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10), array('withscores' => TRUE)));Okay, Schreiben Sie es auf und lassen Sie uns einen Blick darauf werfen.
//note set 一般聚合 for ($i=0; $i < 6; $i++) { $online_user_num = mt_rand(100000, 300000); //online user between 100000 and 300000 for ($j=1; $j < $online_user_num; $j++) { $user_id = mt_rand(1, 1000000); $redis->sadd('001|online_users_day_'.$i, $user_id); } }Keine Sorge, lassen Sie uns nach unten schauen für Benutzer:
//note 判断某个用户是否在线 var_dump($redis->sIsMember('001|online_users_day_5', 100030)); //note 每天在线用户总量的统计 for ($i=0; $i < 6; $i++) { print_r($redis->ssize('001|online_users_day_'.$i). "\n"); } //note 对不同时间段的在线用户名单进行聚合 print_r($redis->sInterStore('001|online_users_day_both_4and5', '001|online_users_day_4', '001|online_users_day_5'). "\n"); //note 对指定的时间段的在线用户名单进行统计 print_r($redis->sUnionStore('001|online_users_day_total_4add5', '001|online_users_day_4', '001|online_users_day_5'). "\n"); //note 哪天上线哪天没上线 print_r($redis->sDiffStore('001|online_users_day_diff_4jian5', '001|online_users_day_4', '001|online_users_day_5'). "\n");Das Schauen wir uns an, welche Art von Diensten mit dieser Lösung erreicht werden können
// note HyperLogLog 只需要知道在线总人数 for ($i=0; $i < 6; $i++) { $online_user_num = mt_rand(100000, 300000); //online user between 100000 and 300000 var_dump($online_user_num); for ($j=1; $j < $online_user_num; $j++) { $user_id = mt_rand(1, 1000000); $redis->pfadd('002|online_users_day_'.$i, [$user_id]); } }Es gibt so wenige, ja, diese Lösung kann nur die Gesamtzahl der Online-Personen in einem bestimmten Zeitraum zählen, Es kann jedoch nichts an der Liste der Online-Benutzer ändern. Es ist jedoch sehr speichersparend. Wenn nicht viele statistische Datenanforderungen bestehen, können wir diese Lösung in Betracht ziehen.
Option 4: Bitmap verwenden
Dem Autor gefällt diese Option zwar nicht, aber die statistischen Informationen sind immer noch ein alter Schritt:rrree Weiter Wie wäre es, wenn wir uns die Statistiken ansehen, die
$count = 0; for ($i=0; $i < 3; $i++) { $count += $redis->pfcount('002|online_users_day_'.$i); print_r($redis->pfcount('002|online_users_day_'.$i). "\n"); } var_dump($count); //note 3 days total online num var_dump($redis->pfmerge('002|online_users_day_both_3', ['002|online_users_day_0', '002|online_users_day_1', '002|online_users_day_2'])); var_dump($redis->pfcount('002|online_users_day_both_3'));zufrieden stellen? Wenn die Sammlung gezählt werden kann, kann dieser Typ sie dann auch zählen? Und es verbraucht weniger Inhalte. Tatsächlich hat jede dieser Lösungen ihre eigenen Vorteile. Wählen Sie laut Unternehmensstatistik die entsprechende Lösung zur Implementierung aus, damit die Speichernutzung angemessener ist
Das obige ist der detaillierte Inhalt vonPHP+REDIS-Praxis: Analyse mehrerer Lösungen zur Zählung von Online-Personen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!