PHP에서 Redis를 이용한 MySQL 데이터 캐시 가이드(Cache MySQL Data with Redis and PHP)
목차
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 서비스 요약
- 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