Heim > Backend-Entwicklung > PHP-Tutorial > PHP+REDIS-Praxis: Analyse mehrerer Lösungen zur Zählung von Online-Personen

PHP+REDIS-Praxis: Analyse mehrerer Lösungen zur Zählung von Online-Personen

藏色散人
Freigeben: 2023-04-09 20:12:02
nach vorne
3871 Leute haben es durchsucht

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(&#39;000|online_users_day_&#39;.$i, mt_rand($day_start_time, $day_end_time), $user_id);
    }
}
Nach dem Login kopieren

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(&#39;000|online_users_day_&#39;.$i). "\n");
}
//note: 统计最近6天都在线的人数
var_dump($redis->zInter(&#39;000|online_users_day_both_6&#39;, 
    [
    &#39;000|online_users_day_0&#39;, 
    &#39;000|online_users_day_1&#39;, 
    &#39;000|online_users_day_2&#39;, 
    &#39;000|online_users_day_3&#39;, 
    &#39;000|online_users_day_4&#39;, 
    &#39;000|online_users_day_5&#39;
    ]
    ));
//note: 统计出近6天中共有多少上线
$redis->zunion(&#39;000|online_users_day_total_6&#39;, [&#39;000|online_users_day_0&#39;, &#39;000|online_users_day_1&#39;, &#39;000|online_users_day_2&#39;, &#39;000|online_users_day_3&#39;, &#39;000|online_users_day_4&#39;, &#39;000|online_users_day_5&#39;]);
//note: 统计某个时间段总共在线用户
print_r($redis->zcount(&#39;000|online_users_day_5&#39;, mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10)));
//note: 统计某个时间段在线用户名单
print_r($redis->zrangebyscore(&#39;000|online_users_day_5&#39;, mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10), 
    array(&#39;withscores&#39; => TRUE)));
Nach dem Login kopieren
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(&#39;001|online_users_day_&#39;.$i, $user_id);
    }
}
Nach dem Login kopieren

Keine Sorge, lassen Sie uns nach unten schauen für Benutzer:

//note 判断某个用户是否在线
var_dump($redis->sIsMember(&#39;001|online_users_day_5&#39;, 100030));
//note 每天在线用户总量的统计
for ($i=0; $i < 6; $i++) { 
    print_r($redis->ssize(&#39;001|online_users_day_&#39;.$i). "\n");
}
//note 对不同时间段的在线用户名单进行聚合
print_r($redis->sInterStore(&#39;001|online_users_day_both_4and5&#39;, &#39;001|online_users_day_4&#39;, &#39;001|online_users_day_5&#39;). "\n");
//note 对指定的时间段的在线用户名单进行统计
print_r($redis->sUnionStore(&#39;001|online_users_day_total_4add5&#39;, &#39;001|online_users_day_4&#39;, &#39;001|online_users_day_5&#39;). "\n");
//note 哪天上线哪天没上线
print_r($redis->sDiffStore(&#39;001|online_users_day_diff_4jian5&#39;, &#39;001|online_users_day_4&#39;, &#39;001|online_users_day_5&#39;). "\n");
Nach dem Login kopieren
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(&#39;002|online_users_day_&#39;.$i, [$user_id]);
    }
}
Nach dem Login kopieren

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(&#39;002|online_users_day_&#39;.$i);
    print_r($redis->pfcount(&#39;002|online_users_day_&#39;.$i). "\n");
}
var_dump($count);
//note  3 days total online num
var_dump($redis->pfmerge(&#39;002|online_users_day_both_3&#39;, [&#39;002|online_users_day_0&#39;, &#39;002|online_users_day_1&#39;, &#39;002|online_users_day_2&#39;]));
var_dump($redis->pfcount(&#39;002|online_users_day_both_3&#39;));
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:饼bing
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage