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

藏色散人
藏色散人nach vorne
2021-03-17 17:24:263932Durchsuche

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);
    }
}

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)));
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);
    }
}

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");
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]);
    }
}

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;));

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:饼bing. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen