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); } }
[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)));
//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); } }
//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");
// 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]); } }
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'));
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!