Rumah > pembangunan bahagian belakang > masalah PHP > Bagaimana untuk menanyakan struktur data bukan pendua dalam php

Bagaimana untuk menanyakan struktur data bukan pendua dalam php

PHPz
Lepaskan: 2023-04-04 17:20:02
asal
689 orang telah melayarinya

Apabila Internet terus berkembang, penggunaan pangkalan data dalam laman web dan aplikasi telah menjadi semakin biasa. Apabila membangunkan dan menyelenggara aplikasi, menanya data adalah tugas yang sangat kritikal Cara membuat pertanyaan dan memproses data dengan cekap telah menjadi isu penting yang dihadapi oleh pembangun. Artikel ini akan memperkenalkan kaedah menanyakan struktur data bukan pendua dengan PHP untuk menyelesaikan masalah ini.

  1. Pengenalan Kes

Andaikan terdapat sistem pengiklanan Setiap iklan mempunyai nombor ID yang unik dan boleh dipaparkan pada halaman yang berbeza. Jika anda ingin memaparkan iklan pada halaman tertentu, anda boleh menanyakan data iklan dalam pangkalan data MySQL dan menapis keputusan mengikut tiga syarat berikut:

1) Status paparan: hanya paparan "displaying" Iklan dengan status (status=1).

2) Kebarangkalian paparan: Setiap iklan mempunyai kebarangkalian paparan (nisbah_tunjuk), dan diputuskan sama ada untuk memaparkan iklan berdasarkan kebarangkalian.

3) Hapuskan paparan pendua: Jangan paparkan iklan pendua pada halaman yang sama.

Bagaimana untuk menanyakan data pengiklanan yang memenuhi syarat dengan cekap? Ini memerlukan struktur data bukan pendua yang cekap untuk diselesaikan.

  1. Pengenalan kepada struktur data bukan pendua

Untuk memenuhi syarat pertanyaan di atas, artikel ini memperkenalkan struktur data bukan pendua berdasarkan Redis - HyperLogLog (HLL ringkasnya), HLL boleh menganggarkan kardinaliti dengan cekap, iaitu bilangan elemen yang berbeza, bagi set data. Menggunakan HLL, anda boleh mengira dengan cepat bilangan iklan dengan status paparan "Dalam Paparan" dan kebarangkalian paparan yang memenuhi keperluan, dan mengalih keluar paparan pendua.

HLL menganggarkan kardinaliti set data dengan menggunakan set fungsi cincang Prinsip pelaksanaannya serupa dengan penapis Bloom, tetapi kadar ralatnya lebih rendah. Dalam Redis, jenis HLL menyediakan perintah pfadd untuk menambah elemen dan perintah pfcount untuk mengira kardinaliti. Berikut ialah contoh kod PHP:

$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'); // 获取基数
Salin selepas log masuk

Kod di atas menggunakan HLL dalam Redis untuk menyimpan ID pengiklanan dan menentukan sama ada iklan telah dipaparkan dengan menambah ID pengiklanan dan mengira asas.

  1. Pelaksanaan Kes

Dalam kes ini, tanya dahulu semua iklan yang status paparannya ialah "Memaparkan", kemudian hitung bilangan iklan yang memenuhi keperluan kebarangkalian paparan dan akhirnya berdasarkan HLL menghalang pembentangan pendua. Berikut ialah kod pertanyaan PHP:

$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 的基数,则有重复广告
    // 再次处理广告展示逻辑
}
Salin selepas log masuk

Kod di atas menggunakan gelung sementara untuk mengira dan menambah kebarangkalian pada setiap iklan. Kod untuk mengalih keluar paparan pendua berdasarkan HLL terletak di luar gelung while Ia menentukan sama ada terdapat iklan pendua dengan menilai sama ada bilangan elemen yang ditambahkan pada HLL adalah sama dengan bilangan iklan yang telah dikira.

  1. Ringkasan

Artikel ini memperkenalkan kaedah menggunakan Redis untuk melaksanakan struktur data HLL untuk mencapai pertanyaan yang cekap bagi data bukan pendua. Dalam projek sebenar, ia boleh diperbaiki dan dikembangkan mengikut keperluan tertentu. Sebagai contoh, anda boleh menambah masa tamat tempoh untuk mengosongkan elemen yang telah tamat tempoh secara kerap, atau menambah lapisan penapis bloom pada HLL untuk meningkatkan ketepatan penyahduplikasian, dsb. Adalah dipercayai bahawa kaedah ini boleh menyelesaikan masalah penyahduplikasian yang sering dihadapi semasa menyoal data dan meningkatkan kecekapan dan prestasi aplikasi.

Atas ialah kandungan terperinci Bagaimana untuk menanyakan struktur data bukan pendua dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan