한줄공지
  • 등록된 공지내용이 없습니다.

Ubuntu 20.04에서 Redis®와 PHP를 사용하여 MySQL 데이터 캐시하기

2024년 7월 5일
조회수 45
코멘트 0

목차

소개

Redis® (Remote Dictionary Server)는 빠른 오픈 소스 인메모리 키-값 데이터베이스로, 문자열, 해시, 리스트, 집합 등을 지원하여 성능 중심 시스템을 만들기에 이상적입니다.

Redis®는 데이터를 랜덤 액세스 메모리(RAM)에 저장하기 때문에 디스크에서 데이터에 액세스할 때 시간을 최소화합니다. 이 기능은 Redis®를 고가용성과 확장 가능한 응용 프로그램을 만드는 다목적 데이터 구조로 만듭니다.

이 안내서는 Redis® 서버를 사용하여 Ubuntu 20.04에서 PHP로 MySQL에 효율적이고 신뢰할 수 있는 캐싱 메커니즘을 구현하는 방법을 보여줍니다.

전제 조건

시작하기 전에 다음 사항을 확인하십시오:

  • Ubuntu 20.04 서버
  • sudo 사용자
  • Lamp Stack
  • Redis® 서버

Redis® 확장 프로그램 설치

Ubuntu 서버에 SSH로 연결하고 php-redis 확장 프로그램을 설치합니다.

$ sudo apt install -y php-redis

Apache 서버를 재시작합니다.

$ sudo systemctl restart apache2

테스트 데이터베이스 생성

MySQL 서버에 로그인합니다.

$ sudo mysql -u root -p

MySQL 서버의 루트 암호를 입력하고 Enter를 눌러 계속합니다.

mysql> 프롬프트를 받으면 sample_company 데이터베이스를 생성합니다.

mysql> CREATE DATABASE sample_company;

sample_company 데이터베이스에 sample_user를 생성하고 위에서 만든 데이터베이스에 대한 전체 권한을 할당합니다. EXAMPLE_PASSWORD를 강력한 암호로 바꿔야 합니다.

mysql> CREATE USER 'sample_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'EXAMPLE_PASSWORD';
mysql> GRANT ALL PRIVILEGES ON sample_company.* TO 'sample_user'@'localhost';
mysql> FLUSH PRIVILEGES;

sample_company 데이터베이스를 선택합니다.

mysql> USE sample_company;

employees 테이블을 작성합니다. 이 테이블은 MySQL 데이터베이스의 디스크에 영구적으로 사원 데이터 (employee_id, first_name, last_name)를 저장하는 기본 테이블입니다.

mysql> CREATE TABLE employees (
       employee_id INT AUTO_INCREMENT PRIMARY KEY,
       first_name VARCHAR(50),
       last_name  VARCHAR(50)
       );

employees 테이블에 샘플 데이터를 삽입합니다. employee_id를 입력하지 마십시오. 이는 AUTO_INCREMENT 열로 정의되었기 때문입니다.

mysql> INSERT INTO employees (first_name, last_name) VALUES ('JOHN', 'ROE');
mysql> INSERT INTO employees (first_name, last_name) VALUES ('SMITH', 'DOE');
mysql> INSERT INTO employees (first_name, last_name) VALUES ('RICHARD', 'MAJOR');
mysql> INSERT INTO employees (first_name, last_name) VALUES ('JANE', 'ISAAC');

employees 테이블을 쿼리하여 레코드가 삽입되었는지 확인합니다.

mysql> SELECT
       employee_id,
       first_name,
       last_name
       FROM employees;

MySQL 데이터베이스에서 나갑니다.

quit;

PHP 스크립트 생성

사이트의 루트 디렉토리에 PHP 스크립트를 만듭니다. 이 파일은 위에서 만든 MySQL 데이터베이스에 연결하고 employees 테이블을 쿼리합니다.

/var/www/html/employees.php 파일을 편집하려면 다음을 실행합니다.

$ sudo nano /var/www/html/employees.php

그런 다음 아래 정보를 파일에 삽입합니다. 데이터베이스별, 테이블별, 위에서 만든 사용자별 데이터베이스 변수와 일치시키도록 주의하세요.

<html>
  <head>
    <title>Redis® Server로 PHP와 MySQL 사용하기</title>
  </head>
  <body>
    <h1 align = 'center'>직원 등록</h1>
    <table align = 'center' border = '2'>
    <?php
        try {

            $data_source = '';

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

            $sql = 'select
                    employee_id,
                    first_name,
                    last_name
                    from employees
                    ';

            $cache_key = md5($sql);

            if ($redis->exists($cache_key)) {

                $data_source = "Redis® Server로부터 데이터";
                $data = unserialize($redis->get($cache_key));

            } else {

                $data_source = 'MySQL 데이터베이스로부터 데이터';

                $db_name     = 'sample_company';
                $db_user     = 'sample_user';
                $db_password = 'EXAMPLE_PASSWORD';
                $db_host     = 'localhost';

                $pdo = new PDO('mysql:host=' . $db_host . ';dbname=' . $db_name, $db_user, $db_password);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $pdo->prepare($sql);
                $stmt->execute();
                $data = [];

                while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                   $data[] = $row;
                }

                $redis->set($cache_key, serialize($data));
                $redis->expire($cache_key, 10);
           }

           echo "<tr><td colspan = '3' align = 'center'><h2>$data_source</h2></td></tr>";
           echo "<tr><th>직원 ID</th><th>이름</th><th>성</th></tr>";

           foreach ($data as $record) {
              echo '<tr>';
              echo '<td>' . $record['employee_id'] . '</td>';
              echo '<td>' . $record['first_name'] . '</td>';
              echo '<td>' . $record['last_name']  . '</td>';
              echo '</tr>';
           }

        } catch (PDOException $e) {
            echo '데이터베이스 오류. ' . $e->getMessage();
        }
   ?>
    </table>
  </body>
</html>

파일을 저장하려면 Ctrl + X, Y, Enter를 눌러 닫습니다.

/var/www/html/employees.php 파일 설명:

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

위의 두 줄은 Redis® 서버에 연결하고 스크립트에서 나중에 Redis® 서버 쿼리에 사용할 $redis 변수를 초기화합니다.

$sql = 'select
        employee_id,
        first_name,
        last_name
        from employees
        ';
$cache_key = md5($sql);

위의 $sql 변수는 실제로 데이터베이스에서 레코드를 검색하는 SQL 명령을 보유합니다. Redis® 서버는 키-값 데이터를 저장하기 위해 $cache_key 변수를 사용합니다. 이 스크립트는 SQL 명령의 md5 해시를 사용하여 키를 줄여 디버깅을 쉽게 만듭니다.

if ($redis->exists($cache_key)) {
    $data_source = "Redis® Server로부터 데이터";
    $data = unserialize($redis->get($cache_key));
...

} else {

    $data_source = 'MySQL 데이터베이스로부터 데이터';

    ...

    $redis->set($cache_key, serialize($data));
    $redis->expire($cache_key, 10);
...

위의 코드는 Redis® 서버에서 $cache_key 키의 존재 여부를 확인합니다. 키가 존재하는 경우 스크립트는 데이터를 검색하고 unserialize하여 $data 변수에 저장합니다. 그렇지 않은 경우 MySQL 데이터베이스에서 데이터를 가져와 $redis->set 명령을 사용하여 캐시합니다.

$redis->expire 명령은 삭제되기 전에 메모리에 지속되는 키의 만료 시간(초)을 설정합니다. 10 초를 만료 기간으로 사용했습니다. 이 값을 필요에 맞게 변경하세요.

Redis® 캐시 테스트

아래 URL을 방문하여public_ip_address를 웹 사이트의 공개 IP 주소로 바꿉니다.

http://public_ip_address/employees.php

웹 페이지를 처음 방문할 때, 스크립트는 MySQL 서버에서 데이터를 검색해 출력 합니다.

페이지를 새로 고치면, 이번에는 PHP가 Redis® 서버에서 캐시된 데이터를 제공합니다.

위의 출력은 PHP 스크립트가 예상대로 작동하고 Redis® 서버의 빠른 인메모리 캐시에서 데이터가 제공되는 것을 확인합니다. 디스크에서 데이터를 검색하는 시간이 최소화됩니다. 캐시를 무효화하기 위해 10초 후 페이지를 새로 고쳐봐도 좋습니다.

결론

이 가이드에서는 Redis® 서버를 사용하여 Ubuntu 20.04에서 PHP로 MySQL에 대한 효율적이고 신뢰할 수 있는 캐싱 메커니즘을 구축했습니다. 이 튜토리얼의 PHP 스크립트를 확장하여 웹 사이트나 웹 응용 프로그램의 성능을 향상시킬 때 자주 읽히는 부분을 캐시하는 방법을 시도해 보세요.

 

출처: https://docs.vultr.com/cache-mysql-data-with-redis-and-php-on-ubuntu-20-04

안정적이고 저렴한 가상 서버(VPS) 안내

안정적인 서버 호스팅을 찾고 계신가요? 지금 Vultr 호스팅을 한번 이용 해 보세요. 지금 보고 계신 HaruLogs 사이트도 Vultr에서 VPS 호스팅 하고 있습니다. 한국, 일본, 미국등 다양한 국가에 클릭 몇번으로 안정적이고 저렴한 VPS를 운영 할 수 있습니다.

아래 배너를 통해 회원 가입을 하시면 100달러의 무료 크레딧을 받을 수 있습니다. 100달러의 무료 크레딧은 Vultr의 최소 사양 VPS를 20대 동시 운영가능한 크레딧입니다.

지금 무료로 Vultr $100 크레딧 선물 받기

 

Vultr 서비스 요약

  • VPS
    • 인스턴스
      • AMD 또는 Intel High Performance 인스턴스 최저 $6 - 1vCPU, 1GB Memory, 2TB Bandwidth, 25GB NVMe
    • 엣지
  • Block Storage
  • Object Storage (AWS S3 호환)
  • Firewall
  • Network
  • Load Balancers
  • Kubernetes
  • Databases
포스트 통계
지금 보고있는 포스트의 통계 데이터를 확인 해 보세요.
  • 총 조회수
    46
  • 최근 30일 조회수
    2
연관 포스트
코멘트 작성