Home > Backend Development > PHP Tutorial > How to use distributed cache to improve the concurrency performance of PHP programs?

How to use distributed cache to improve the concurrency performance of PHP programs?

王林
Release: 2023-08-10 13:38:02
Original
947 people have browsed it

How to use distributed cache to improve the concurrency performance of PHP programs?

How to use distributed cache to improve the concurrency performance of PHP programs?

Overview:
When developing high-concurrency PHP programs, we often encounter performance bottlenecks caused by frequent database access. To solve this problem, we can use a distributed cache system to improve concurrency performance. This article will introduce how to use the distributed cache system Redis to optimize the concurrency performance of PHP programs and provide corresponding code examples.

  1. Installation and Configuration Redis
    First, we need to install Redis and make sure it is running properly on the server. Redis can be installed through the following command:

    sudo apt-get install redis-server
    Copy after login

    After the installation is complete, start the Redis server:

    sudo systemctl start redis
    Copy after login

    You can verify the running status of the Redis server by checking whether it is running:

    redis-cli ping
    Copy after login

    If "PONG" is returned, it means that the Redis server is running normally.

  2. Redis Extension
    In order to use Redis in PHP, we need to install the Redis extension. You can install the Redis extension through the following command:

    sudo apt-get install php-redis
    Copy after login

    After the installation is complete, edit the PHP configuration file php.ini and ensure that the following lines are not commented out:

    extension=redis.so
    Copy after login

    Restart the PHP server to enable the configuration Effective:

    sudo systemctl restart php-fpm
    Copy after login
  3. Use Redis to cache query results
    In PHP programs, we often need to frequently access the database to obtain data. In order to reduce the burden on the database, we can use Redis to cache query results, thereby improving concurrency performance.

    <?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;
    ?>
    Copy after login

    In the above sample code, we use Redis cache to store query results. First, the program will check whether the required data already exists in the cache. If it exists, the data in the cache will be used directly. If it does not exist in the cache, the data will be obtained from the database and saved to the Redis cache. At the same time, the cache will be set. Expiration time is 60 seconds.

By caching query results, we can avoid frequent access to the database and improve concurrency performance. In addition, by setting an appropriate cache expiration time, we can flexibly control the validity period of cached data.

  1. Distributed Cache
    In order to further improve concurrency performance, we can use a distributed cache system to store cached data distributedly on multiple servers.

When we use multiple Redis servers, we can use a hash function to decide which Redis server to store the data on. The following is a sample code that uses a consistent hash algorithm to implement distributed caching:

<?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;
?>
Copy after login

In the above sample code, we use a consistent hash algorithm to decide which Redis server to store data on. First, we calculate the hash value of the key through a hash function, and then select a Redis server to store the data based on the hash value. This way, data can be distributed across multiple Redis servers, improving concurrency performance.

The above is the method and sample code for using the distributed cache system Redis to improve the concurrency performance of PHP programs. By caching query results and distributed caching, we can effectively reduce the burden on the database and improve the concurrency performance of PHP programs. Hope this article is helpful to you!

The above is the detailed content of How to use distributed cache to improve the concurrency performance of PHP programs?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template