Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan cache yang diedarkan untuk meningkatkan prestasi konkurensi program PHP?

Bagaimana untuk menggunakan cache yang diedarkan untuk meningkatkan prestasi konkurensi program PHP?

王林
王林asal
2023-08-10 13:37:11854semak imbas

Bagaimana untuk menggunakan cache yang diedarkan untuk meningkatkan prestasi konkurensi program PHP?

Bagaimana untuk menggunakan cache yang diedarkan untuk meningkatkan prestasi serentak program PHP?

Gambaran Keseluruhan:
Apabila membangunkan program PHP serentak tinggi, kami sering menghadapi kesesakan prestasi yang disebabkan oleh akses pangkalan data yang kerap. Untuk menyelesaikan masalah ini, kami boleh menggunakan sistem cache yang diedarkan untuk meningkatkan prestasi serentak. Artikel ini akan memperkenalkan cara menggunakan sistem caching teragih Redis untuk mengoptimumkan prestasi serentak program PHP dan menyediakan contoh kod yang sepadan.

  1. Memasang dan Mengkonfigurasi Redis
    Mula-mula, kita perlu memasang Redis dan pastikan ia berjalan dengan betul pada pelayan. Anda boleh memasang Redis melalui arahan berikut:

    sudo apt-get install redis-server

    Selepas pemasangan selesai, mulakan pelayan Redis:

    sudo systemctl start redis

    Anda boleh mengesahkan status berjalan pelayan Redis dengan menyemak sama ada ia sedang berjalan:

    redis-cli ping

    Jika "PONG" dikembalikan, ini bermakna pelayan Redis dijalankan secara normal.

  2. Redis Extension
    Untuk menggunakan Redis dalam PHP, kita perlu memasang sambungan Redis. Anda boleh memasang sambungan Redis dengan arahan berikut:

    sudo apt-get install php-redis

    Selepas pemasangan selesai, edit fail konfigurasi PHP php.ini dan pastikan baris berikut tidak dikomentari:

    extension=redis.so

    Mulakan semula pelayan PHP untuk membuat konfigurasi berkuat kuasa:

    sudo systemctl restart php-fpm
  3. Gunakan keputusan pertanyaan cache Redis
    Dalam program PHP, kita selalunya perlu kerap mengakses pangkalan data untuk mendapatkan data. Untuk mengurangkan beban pada pangkalan data, kami boleh menggunakan Redis untuk cache hasil pertanyaan, dengan itu meningkatkan prestasi serentak.

    <?php
    // 初始化 Redis
    $redis = new Redis();
    $redis->connect('localhost', 6379); // 默认的 Redis 服务器地址和端口
    
    function getDataFromDatabase($id) {
     // 模拟从数据库中获取数据的过程
     sleep(2);
     return "data_" . $id;
    }
    
    function getDataFromCache($id) {
     global $redis;
     return $redis->get($id);
    }
    
    function saveDataToCache($id, $data) {
     global $redis;
     $redis->set($id, $data);
     $redis->expire($id, 60); // 设置缓存的过期时间为 60 秒
    }
    
    function getData($id) {
     $data = getDataFromCache($id);
     if (!$data) {
         $data = getDataFromDatabase($id);
         saveDataToCache($id, $data);
     }
     return $data;
    }
    
    $id = $_GET['id'];
    $data = getData($id);
    echo $data;
    ?>

    Dalam kod sampel di atas, kami menggunakan cache Redis untuk menyimpan hasil pertanyaan. Pertama, program akan menyemak sama ada data yang diperlukan sudah wujud dalam cache Jika ia wujud, data dalam cache akan digunakan secara langsung Jika ia tidak wujud dalam cache, data akan diperolehi daripada pangkalan data dan disimpan ke cache Redis Pada masa yang sama, masa tamat tempoh ialah 60 saat.

Dengan meng-cache hasil pertanyaan, kami boleh mengelakkan akses kerap kepada pangkalan data dan meningkatkan prestasi serentak. Selain itu, dengan menetapkan masa tamat tempoh cache yang sesuai, kami boleh mengawal tempoh sah data cache secara fleksibel.

  1. Cache Teragih
    Untuk meningkatkan lagi prestasi konkurensi, kami boleh menggunakan sistem cache teragih untuk menyimpan data cache secara teragih pada berbilang pelayan.

Apabila kami menggunakan berbilang pelayan Redis, kami boleh menggunakan fungsi cincang untuk menentukan pelayan Redis untuk menyimpan data. Berikut ialah kod sampel yang menggunakan algoritma pencincangan yang konsisten untuk melaksanakan caching teragih:

<?php
// 初始化 Redis 服务器地址和端口
$redisServers = [
    '127.0.0.1:6379', '127.0.0.1:6380', '127.0.0.1:6381'
];

// 初始化 Redis 连接
$redisConnections = [];
foreach ($redisServers as $server) {
    $redis = new Redis();
    list($host, $port) = explode(":", $server);
    $redis->connect($host, $port);
    $redisConnections[] = $redis;
}

function getDataFromCache($id) {
    global $redisConnections;
    $hash = crc32($id); // 使用 CRC32 哈希函数计算哈希值
    $index = $hash % count($redisConnections); // 根据哈希值选择 Redis 服务器
    return $redisConnections[$index]->get($id);
}

function saveDataToCache($id, $data) {
    global $redisConnections;
    $hash = crc32($id);
    $index = $hash % count($redisConnections);
    $redisConnections[$index]->set($id, $data);
    $redisConnections[$index]->expire($id, 60);
}

$id = $_GET['id'];
$data = getDataFromCache($id);
if (!$data) {
    $data = getDataFromDatabase($id);
    saveDataToCache($id, $data);
}
echo $data;
?>

Dalam kod sampel di atas, kami menggunakan algoritma pencincangan yang konsisten untuk memutuskan pelayan Redis untuk menyimpan data. Mula-mula, kami mengira nilai cincang kunci melalui fungsi cincang, dan kemudian pilih pelayan Redis untuk menyimpan data berdasarkan nilai cincang. Dengan cara ini, data boleh diedarkan merentasi berbilang pelayan Redis, meningkatkan prestasi serentak.

Di atas ialah kaedah dan kod sampel untuk menggunakan sistem cache yang diedarkan Redis untuk meningkatkan prestasi serentak program PHP. Dengan meng-caching keputusan pertanyaan dan mengedarkan caching, kami boleh mengurangkan beban pangkalan data dengan berkesan dan meningkatkan prestasi serentak program PHP. Semoga artikel ini dapat membantu anda!

Atas ialah kandungan terperinci Bagaimana untuk menggunakan cache yang diedarkan untuk meningkatkan prestasi konkurensi program PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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