Heim  >  Artikel  >  Backend-Entwicklung  >  So fragen Sie nicht doppelte Datenstrukturen in PHP ab

So fragen Sie nicht doppelte Datenstrukturen in PHP ab

PHPz
PHPzOriginal
2023-04-04 10:44:39640Durchsuche

Mit der kontinuierlichen Entwicklung des Internets wird der Einsatz von Datenbanken in Websites und Anwendungen immer häufiger. Bei der Entwicklung und Wartung von Anwendungen ist die Abfrage von Daten eine sehr wichtige Aufgabe. Die effiziente Abfrage und Verarbeitung von Daten ist für Entwickler zu einem wichtigen Thema geworden. In diesem Artikel wird eine Methode zum Abfragen nicht doppelter Datenstrukturen mit PHP vorgestellt, um dieses Problem zu lösen.

  1. Falleinführung

Angenommen, es gibt ein Werbesystem. Jede Anzeige hat eine eindeutige ID-Nummer und kann auf verschiedenen Seiten angezeigt werden. Wenn Sie die Anzeige auf einer bestimmten Seite anzeigen möchten, können Sie die Anzeigendaten in der MySQL-Datenbank abfragen und die Ergebnisse nach den folgenden drei Bedingungen filtern:

1) Anzeigestatus: Zeigt nur den Status „Anzeige“ an (status= 1) Werbung.

2) Anzeigewahrscheinlichkeit: Jede Anzeige hat eine Anzeigewahrscheinlichkeit (show_ratio), und anhand der Wahrscheinlichkeit wird entschieden, ob die Anzeige angezeigt wird.

3) Doppelte Anzeige: Zeigen Sie keine doppelten Anzeigen auf derselben Seite an.

Wie kann man Werbedaten, die den Bedingungen entsprechen, effizient abfragen? Dies erfordert eine effiziente, nicht duplizierte Datenstruktur.

  1. Einführung in sich nicht wiederholende Datenstrukturen

Um die oben genannten Abfragebedingungen zu erfüllen, stellt dieser Artikel eine sich nicht wiederholende Datenstruktur basierend auf Redis vor – HyperLogLog (kurz HLL), mit dem die Kardinalität von a effizient geschätzt werden kann Datensatz, das heißt, verschiedene Elemente Anzahl. Mit HLL können Sie schnell die Anzahl der Anzeigen mit dem Anzeigestatus „Wird angezeigt“ und der entsprechenden Anzeigewahrscheinlichkeit zählen und doppelte Anzeigen entfernen.

HLL schätzt die Kardinalität eines Datensatzes mithilfe einer Reihe von Hash-Funktionen. Das Implementierungsprinzip ähnelt dem Bloom-Filter, die Fehlerrate ist jedoch geringer. In Redis stellt der HLL-Typ den Befehl pfadd zum Hinzufügen von Elementen und den Befehl pfcount zum Berechnen der Kardinalität bereit. Das Folgende ist ein Beispiel für einen PHP-Code:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->pfadd('ad', 'ad1', 'ad2', 'ad3'); // 添加广告 ID
$redis->pfadd('ad', 'ad3', 'ad4', 'ad5'); // 添加广告 ID
$count = $redis->pfcount('ad'); // 获取基数

Der obige Code verwendet HLL in Redis, um die Werbe-ID zu speichern, und bestimmt, ob eine Werbung angezeigt wurde, indem er die Werbe-ID hinzufügt und die Basis berechnet.

  1. Fallimplementierung

In diesem Fall werden zunächst alle Anzeigen abgefragt, deren Anzeigestatus „Wird angezeigt“ ist, dann die Anzahl der Anzeigen berechnet, die die Anforderungen an die Anzeigewahrscheinlichkeit erfüllen, und schließlich eine wiederholte Anzeige gemäß HLL verhindern. Das Folgende ist ein PHP-Abfragecode:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 查询展示状态为“展示中”的所有广告信息
$sql = "SELECT * FROM ad WHERE status=1";
$result = $mysqli->query($sql);

$total = 0;
while ($row = $result->fetch_assoc()) {
    $show_ratio = $row['show_ratio']; // 广告展示概率
    $ad_id = $row['ad_id']; // 广告 ID

    // 判断是否需要展示该广告
    $rand_num = mt_rand(1, 10000);
    if ($rand_num <= $show_ratio * 10000) {
        $redis->pfadd('ad', $ad_id); // 添加广告 ID
        $total++;
    }
}

$count = $redis->pfcount('ad'); // 获取基数
if ($total != $count) {
    // 如果总数量不等于 HLL 的基数,则有重复广告
    // 再次处理广告展示逻辑
}

Der obige Code verwendet eine While-Schleife, um die Wahrscheinlichkeit für jede Anzeige zu berechnen und hinzuzufügen. Der Code zum Entfernen doppelter Anzeigen basierend auf HLL befindet sich außerhalb der while-Schleife. Er bestimmt, ob doppelte Anzeigen vorhanden sind, indem er beurteilt, ob die Anzahl der zum HLL hinzugefügten Elemente gleich der Anzahl der berechneten Anzeigen ist.

  1. Zusammenfassung

In diesem Artikel wird eine Methode zur Verwendung von Redis zur Implementierung einer HLL-Datenstruktur vorgestellt, um eine effiziente Abfrage nicht doppelter Daten zu erreichen. In konkreten Projekten kann es entsprechend den spezifischen Anforderungen verbessert und erweitert werden. Sie können beispielsweise eine Ablaufzeit hinzufügen, um abgelaufene Elemente regelmäßig zu löschen, oder der HLL eine Ebene mit Bloom-Filtern hinzufügen, um die Genauigkeit der Deduplizierung usw. zu verbessern. Man geht davon aus, dass diese Methoden die bei der Datenabfrage häufig auftretenden Deduplizierungsprobleme lösen und die Effizienz und Leistung von Anwendungen verbessern können.

Das obige ist der detaillierte Inhalt vonSo fragen Sie nicht doppelte Datenstrukturen in PHP ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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