Ubuntu 20.04에서 PHP를 사용하여 Redis를 MySQL 캐시로 설정하는 방법

Ubuntu 20.04에서 PHP를 사용하여 Redis를 MySQL 캐시로 설정하는 방법

2022-06-01 last update

32 minutes reading Redis Ubuntu 20.04 PHP MySQL Databases
저자는 Girls Who CodeWrite for DOnations 계획의 일부로 기부를 받았다.

소개


Redis (Remote Dictionary Server)은 빠른 소스 오픈 메모리 데이터베이스로 확장성이 높고 성능을 위한 시스템의 키 값으로 저장할 수 있습니다.Redis의 일부 용례는 캐시, 고속 사무, 실시간 분석, 실시간 알림, 기계 학습, 검색과 대기열/작업 처리를 포함한다.Redis는 메모리의 키 값 저장소이기 때문에 응용 프로그램에서 데이터를 캐시하는 데 적합합니다.
Caching은 클라이언트가 같은 미래 요청을 할 때 더 빨리 데이터를 제공할 수 있도록 고속 메모리 층(예를 들어 컴퓨터 RAM)에 임시로 데이터를 저장합니다.이것은 매번 디스크에서 데이터를 얻는 것이 아니라 이전에 계산한 데이터에 대한 재사용을 강화시켰다.
PHPMySQL을 사용할 때 Redis를 캐시로 사용하면 하드 드라이브(HDD)나 SSD(SSD)보다 몇 배 빠른 RAM에 데이터를 저장하기 때문에 애플리케이션 성능을 향상시킬 수 있습니다.캐시는 데이터베이스 비용, 즉 백엔드 데이터베이스에 대한 왕복 횟수를 줄이고 백엔드 과부하를 피할 수 있다.
읽기와 쓰기가 쓰기보다 높은 웹 응용 프로그램을 설계할 때 캐시 데이터는 불가결하거나 부족한 디자인 기능이다.이 프로그램들은 블로그, 온라인 상점, 소셜 미디어 사이트를 포함한다.
이 강좌에서는 Redis를 사용하여 Ubuntu 20.04에서 PHP 캐시 MySQL 데이터를 사용합니다.

선결 조건


이 강좌를 완성하려면 다음과 같은 내용이 필요합니다.

  • sudo 권한이 있는 비root 사용자의 Ubuntu 20.04 서버입니다.Initial Server Setup with Ubuntu 20.04 지침에 따라 설치합니다.

  • 등잔더미.How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 20.04 강좌를 따르다.이 안내서의 경우 4 단계를 건너뛰고 웹 사이트에 가상 호스트를 만들 수 있습니다.

  • How To Install and Secure Redis on Ubuntu 20.04 - Quickstart 튜토리얼에 따라 설정된 Redis 서버입니다.
  • 1단계 - PHP용 Redis 라이브러리 설치


    우선, PHP를 사용하여 Redis와 통신할 수 있도록 php-redis 확장을 설치합니다.다음 명령을 실행하여 서버를 업데이트하고 확장자를 설치합니다.
    1. sudo apt update
    2. sudo apt install php-redis
    Apache 웹 서버의 설치를 확인하고 다시 시작하여 확장을 로드합니다.
    1. sudo systemctl restart apache2
    현재 의존항을 설치했습니다. 데이터베이스를 설정할 것입니다.

    단계 2 - 테스트 데이터베이스, 테이블 및 샘플 데이터 설정


    이 단계에서 데이터를 디스크에 영구적으로 저장하는 MySQL 데이터베이스를 만들 것입니다.데이터베이스에 대한 완전한 권한을 가진 사용자 계정과 테이블을 만들 것입니다.
    먼저 루트 사용자로 MySQL 서버에 로그인합니다.
    1. sudo mysql -u root -p
    LAMP 사전 요구 사항에 설정된 MySQL 서버의 루트 암호를 입력합니다.그리고 ENTER을 눌러 계속합니다.
    다음 명령을 사용하여 test_store 데이터베이스를 만듭니다.
    1. CREATE database test_store;
    출력을 확인하여 작업이 성공했는지 확인합니다.
    Output
    Query OK, 1 row affected (0.00 sec)
    다음은 데이터베이스에 사용자를 만듭니다.이 강좌에서 이 사용자를 test\u user라고 부릅니다.강력한 암호로 PASSWORD 대체:
    1. CREATE USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
    다음 방법으로 test_store 데이터베이스에 test\u 사용자 전체 권한을 부여합니다.
    1. GRANT ALL PRIVILEGES ON test_store.* TO 'test_user'@'localhost';
    마지막으로 다음 명령을 실행하여 MySQL에서 grant 테이블을 다시 로드합니다.
    1. FLUSH PRIVILEGES;
    명령이 성공적으로 실행될 때마다 다음 출력을 가져오는지 확인합니다.
    Output
    Query OK, 0 rows affected (0.01 sec)
    ySQL 루트 세션 종료:
    1. quit;
    단어 Bye을 수신하면 서버의 명령줄 인터페이스로 돌아갑니다.
    방금 만든 test\u 사용자의 자격 증명을 사용하여 MySQL 서버에 다시 로그인합니다.
    1. mysql -u test_user -p
    계속하려면 test\u 사용자의 암호를 입력합니다.그런 다음 test_store 프롬프트에서 mysql> 데이터베이스로 전환합니다.
    1. USE test_store;
    다음 출력이 있는지 확인합니다.
    Output
    Database Changed.
    다음은 세 열을 포함하는 products 테이블을 만들 것입니다.product_id 열을 사용하여 각 제품을 고유하게 식별합니다.ID를 수동으로 할당하지 않으려면 AUTO_INCREMENT 키워드를 사용합니다.그리고 BIGINT열의 product_id 데이터 형식을 대형 데이터 집합을 지원하는 데 사용합니다. BIGINT data type의 최소치는 -2^63이고 최대치는 2^63-1이다.product_name 필드는 프로젝트의 실제 이름을 저장합니다.이 경우 길이 VARCHAR자의 50 data type이면 충분하다.products 표의 마지막 열은 price입니다. 당신은 DOUBLE data type을 사용하여 소수의 가격을 조정할 것입니다(예를 들어 16.33).products 테이블을 만들려면 다음 명령을 실행합니다.
    1. CREATE table products
    2. (
    3. product_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    4. product_name VARCHAR(50),
    5. price DOUBLE
    6. ) Engine = InnoDB;
    다음 출력을 받게 됩니다.
    Output
    Query OK, 0 rows affected (0.01 sec)
    현재 테스트를 위해 products 표를 채울 기록을 사용합니다.product_id 열에 수동으로 데이터를 입력할 필요가 없습니다. AUTO_INCREMENT 열이 이 작업을 완성하기 때문입니다.다음 명령을 하나씩 실행합니다.
    1. INSERT INTO products(product_name, price) VALUES ('Virtual Private Servers', '5.00');
    2. INSERT INTO products(product_name, price) VALUES ('Managed Databases', '15.00');
    3. INSERT INTO products(product_name, price) VALUES ('Block Storage', '10.00');
    4. INSERT INTO products(product_name, price) VALUES ('Managed Kubernetes', '60.00');
    5. INSERT INTO products(product_name, price) VALUES ('Load Balancer', '10.00');
    각 명령을 실행한 후 다음 출력을 확인하십시오.
    Output
    Query OK, 1 row affected (0.00 sec)
    SELECT 명령을 사용하여 데이터를 검증합니다.
    1. SELECT * FROM products;
    다음과 같은 출력을 받을 수 있습니다.
    Output
    +------------+-------------------------+-------+ | product_id | product_name | price | +------------+-------------------------+-------+ | 1 | Virtual Private Servers | 5 | | 2 | Managed Databases | 15 | | 3 | Block Storage | 10 | | 4 | Managed Kubernetes | 60 | | 5 | Load Balancer | 10 | +------------+-------------------------+-------+ 5 rows in set (0.00 sec)
    test\u 사용자의 MySQL 세션을 종료하려면 다음과 같이 하십시오.
    1. quit;
    test_store 데이터베이스, products 테이블과test\u 사용자를 설정하면 MySQL 데이터베이스에서 데이터를 검색하여 Redis에 캐시하는 PHP 스크립트를 작성합니다.

    3단계 - MySQL 데이터 가져오기 및 캐시를 위한 PHP 스크립트 설계


    이 단계에서는 이전 단계에서 생성된 예제 데이터를 검색하는 PHP 스크립트를 만듭니다.
    스크립트를 처음 실행하면 MySQL(디스크)에서 데이터를 읽고 Redis에 캐시합니다.따라서 제품 데이터의 후속 읽기는 Redis(시스템 RAM)에서 수행됩니다.시스템 메모리의 속도는 심지어 가장 빠른 솔리드 스테이트 드라이브보다 몇 배 빠르기 때문에 Redis 캐시에서 데이터를 검색하는 속도는 시스템 디스크에서 데이터를 읽는 속도보다 빠르다.
    참고: 성능이 향상되지 않았을 수도 있지만 MySQL 데이터베이스에서만 몇 개의 기록을 검색했기 때문에 일부 기준 테스트에서는 수십만 개의 기록을 처리할 때 Redis에서 캐시 데이터를 검색하는 속도가 MySQL에서 데이터를 읽는 속도의 몇 배라는 것을 증명합니다.
    웹 사이트의 루트 디렉터리에 products.php 파일을 만듭니다.
    1. sudo nano /var/www/html/products.php
    먼저 다음 정보를 입력하여 Redis 인스턴스를 연결하고 생성하여 $redis 변수에 객체로 저장합니다.
    주소 127.0.0.1localhost에 연결합니다.원격 서버에서 Redis를 실행하면 이 값을 변경할 수 있습니다.REDIS_PASSWORD 구성 파일에서 Redis에 설정된 특정 암호로 /etc/redis/redis.conf을 교체하는 것을 기억하십시오.
    또한 적절한 포트 번호를 입력하십시오.Redis는 기본적으로 포트 6379에서 실행됩니다.
    /var/www/html/products.php
    <?php
    
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('REDIS_PASSWORD');
    
    참고: 이 안내서에서 $redis->auth('REDIS_PASSWORD') 명령은 암호를 Redis로 명문으로 보냅니다.운영 환경에서는 더 강력한 액세스 제어 계층 (예: TLS (Transport Layer Security)) 을 사용하여 Redis와 PHP 코드를 실행하는 클라이언트 서버 간의 종합적인 통신을 보호할 수 있습니다.또한 /etc/redis/redis.conf 파일에 Redis 암호를 설정할 때 폭력 공격을 방지하기 위해 길고 강한 값을 설정했는지 확인하십시오.
    다음은 Redis에서 키로 사용할 PHP 변수를 초기화하는 것입니다.
    이 설명서에서 설명한 바와 같이 Redis는 키 값 데이터베이스로 사용되기 때문에 저장하고 검색할 데이터에 유일한 키를 가져야 합니다.
    따라서 PRODUCTS 파일에 다음 정보를 추가하여 /var/www/html/products.php 키를 정의합니다.PRODUCTS 키 대신 모든 이름을 자유롭게 사용할 수 있습니다.
    ySQL 데이터베이스에서 데이터를 검색하면 PHP 스크립트는 이 키를 사용하여 정보를 Redis에 캐시합니다.
    /var/www/html/products.php
    ...
    $key = 'PRODUCTS';
    
    다음은 Redis에 if...else 키가 있는지 확인하기 위한 조건부 PHP PRODUCTS 문구를 포함합니다.
    /var/www/html/products.php
    ...
    if (!$redis->get($key)) {
        $source = 'MySQL Server';
        $database_name     = 'test_store';
        $database_user     = 'test_user';
        $database_password = 'PASSWORD';
        $mysql_host        = 'localhost';
    
        $pdo = new PDO('mysql:host=' . $mysql_host . '; dbname=' . $database_name, $database_user, $database_password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        $sql  = "SELECT * FROM products";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
    
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
           $products[] = $row;
        }
    
        $redis->set($key, serialize($products));
        $redis->expire($key, 10);
    
    } else {
         $source = 'Redis Server';
         $products = unserialize($redis->get($key));
    
    }
    
    echo $source . ': <br>';
    print_r($products);
    
    이 키가 Redis에 없으면 스크립트는 이전에 만든 데이터베이스에 연결되어 products 테이블을 조회하고 $redis->set($key, serialize($products)) 명령을 사용하여 데이터를 Redis에 저장합니다.$redis->expire($key, 10); 명령은 만료 시간을 10초로 설정합니다.캐시 정책에 따라 이 값을 조정할 수 있습니다.$sourceecho $source 명령을 사용하여 스크립트 끝에 데이터를 수조로 되돌린 후 print_r($products) 변수를 사용하면 데이터 원본을 식별할 수 있습니다.
    모든 내용을 한데 모으면 /var/www/html/products.php 파일은 다음과 같습니다.
    /var/www/html/products.php
    <?php
    
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('REDIS_PASSWORD');
    
    $key = 'PRODUCTS';
    
    if (!$redis->get($key)) {
        $source = 'MySQL Server';
        $database_name     = 'test_store';
        $database_user     = 'test_user';
        $database_password = 'PASSWORD';
        $mysql_host        = 'localhost';
    
        $pdo = new PDO('mysql:host=' . $mysql_host . '; dbname=' . $database_name, $database_user, $database_password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        $sql  = "SELECT * FROM products";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
    
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
           $products[] = $row;
        }
    
        $redis->set($key, serialize($products));
        $redis->expire($key, 10);
    
    } else {
         $source = 'Redis Server';
         $products = unserialize($redis->get($key));
    
    }
    
    echo $source . ': <br>';
    print_r($products);
    
    
    파일을 저장하고 닫습니다.
    이제 MySQL에 연결하고 데이터를 Redis에 캐시하는 PHP 스크립트가 설정되었습니다.다음 단계에서 스크립트를 테스트할 것입니다.

    단계 4 - PHP 스크립트 테스트


    Redis에서 MySQL 데이터베이스의 데이터를 캐시하는지 확인하려면 브라우저 창에 PHP 스크립트의 경로를 입력해야 합니다.your_server_IP을 서버의 공용 IP 주소로 대체하는 것을 기억하십시오. 예를 들어 http://your_server_IP/products.php입니다.
    이 스크립트를 처음 실행할 때 다음 MySQL 데이터베이스 데이터가 표시됩니다. PHP 스크립트가 Redis에 캐시되지 않았기 때문입니다.
    MySQL Server
    Array ( [0] => Array ( [product_id] => 1 [product_name] => Virtual Private Servers [price] => 5 ) [1] => Array ( [product_id] => 2 [product_name] => Managed Databases [price] => 15 ) [2] => Array ( [product_id] => 3 [product_name] => Block Storage [price] => 10 ) [3] => Array ( [product_id] => 4 [product_name] => Managed Kubernetes [price] => 60 ) [4] => Array ( [product_id] => 5 [product_name] => Load Balancer [price] => 10 ) )
    
    스크립트를 다시 실행하면 Redis에서 데이터를 읽고 있는지 확인하고 Redis가 MySQL의 캐시로 사용됩니다.
    Redis Server
    Array ( [0] => Array ( [product_id] => 1 [product_name] => Virtual Private Servers [price] => 5 ) [1] => Array ( [product_id] => 2 [product_name] => Managed Databases [price] => 15 ) [2] => Array ( [product_id] => 3 [product_name] => Block Storage [price] => 10 ) [3] => Array ( [product_id] => 4 [product_name] => Managed Kubernetes [price] => 60 ) [4] => Array ( [product_id] => 5 [product_name] => Load Balancer [price] => 10 ) )
    
    키는 10초 후에 만료되며 데이터는 MySQL에서 다시 검색됩니다.

    결론


    이 설명서에서는 Redis를 사용하여 Ubuntu 20.04에서 PHP 캐시 MySQL 데이터를 사용합니다.이 안내서의 인코딩을 사용하여 MySQL 데이터에 캐시 메커니즘을 설정할 수 있습니다. 이것은 고유량 웹 응용 프로그램에 특히 유용합니다.
    당신은 우리의 Redis topic page을 보고 더 많은 교육 자원을 이해할 수 있습니다.또는 PHP topic page의 추가 강좌와 내용을 통해 PHP 인코딩에 대한 더 많은 정보를 얻을 수 있습니다.