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

PHP에서 Redis를 이용한 MySQL 데이터 캐시 가이드(Cache MySQL Data with Redis and PHP)

2022년 10월 25일
조회수 145
코멘트 0

목차

Redis(Remote Dictionary Server)는 문자열, 해시, 목록 및 집합을 포함한 풍부한 데이터 유형을 지원하는 빠른 In memory key-value DB로 성능 지향 시스템을 만드는데 이상적인 선택입니다.

Redis는 RAM(Random Access Memory)에 데이터를 저장하기 때문에 디스크에서 데이터에 엑세스할 때 탐색 시간을 최소화 합니다. 이 기능은 Redis를 고가용성 및 확장 가능한 애플리케이션을 만들기 위한 최선의 선택지가 됩니다.

이 가이드는 Redis서버를 사용하여 PHP로 MySQL을 위한 효율적이고 안정적인 캐싱 메커니즘에 대해 안내 합니다. (이 가이드는 Ubuntu 20.04를 기준으로 작성되었습니다.)

 

사전 요구 사항

 

PHP Extension 설치

PHP에서 Redis를 사용하기 위해 php-redis를 설치 합니다.

$ sudo apt install -y php-redis

Apache 서버를 다시 시작합니다.

$ sudo systemctl restart apache2

 

테스트 데이터베이스 생성

MySQL 서버에 로그인 합니다.

$ sudo mysql -u root -p

MySQL 서버의 루트 비밀번호를 입력하고 ENTER를 누르십시오.

mysql> CREATE DATABASE sample_company;

위에서 만든 데이터베이스에 sample_user MySQl 계정을 생성후 sample_company 테이블의 전체 권한을 할당합니다.

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> CREATE TABLE employees (
       employee_id INT AUTO_INCREMENT PRIMARY KEY, 
       first_name VARCHAR(50), 
       last_name  VARCHAR(50)         
);

샘플 데이터를 테이블에 삽입 합니다.

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');

테이블에 레코드가 잘 저장되었는지 확인합니다.

mysql> SELECT employee_id, first_name, last_name from employees;
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|           1 | JOHN       | ROE       |
|           2 | SMITH      | DOE       |
|           3 | RICHARD    | MAJOR     |
|           4 | JANE       | ISAAC     |
+-------------+------------+-----------+
4 rows in set (0.00 sec)

 

PHP 스크립트 만들기

PHP 스크립트를 만듭니다. 이 파일은 위에서 생성한 MySQL 데이터베이스에 연결하고 employees 테이블을 쿼리 및 캐싱 합니다.

 

Redis 서버에 접속 합니다.

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

DB 쿼리문을 작성합니다.

$sql = "SELECT employee_id, first_name, last_name from employees";

Redis 서버에서 사용할 캐시키를 생성 합니다.

$cache_key = md5($sql);

Redis에 캐시키가 있을경우 Redis에서 데이터를 가져 옵니다.

$data = json_decode($redis->get($cache_key), true);

Redis에 캐시키가 없을경우 MySQL에서 데이터를 가져온뒤 Redis에 데이터를 저장 합니다. $redis->expire에서 두번째 인자는 캐시의 유효시간(초)입니다. 예제에서는 10초후 캐시가 만료됩니다.

$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, json_encode($data));
$redis->expire($cache_key, 10);

데이터를 출력 합니다.

print_r($data);

 

전체 PHP 스크립트

$redis = new Redis();
$redis->connect("127.0.0.1", 6379);
$sql = "SELECT employee_id, first_name, last_name from employees";
$cache_key = md5($sql);
$data = json_decode($redis->get($cache_key), true);
if(is_array($data)) {
  $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, json_encode($data));
  $redis->expire($cache_key, 10);
}
print_r($data);

안정적이고 저렴한 가상 서버(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
포스트 통계
지금 보고있는 포스트의 통계 데이터를 확인 해 보세요.
  • 총 조회수
    145
  • 최근 30일 조회수
    18
연관 포스트
코멘트 작성