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

2022년 10월 25일
조회수 7
코멘트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);
댓글 0