Redis는 주로 메모리에 데이터를 저장하는 데이터 저장소입니다. 이는 기존 데이터베이스보다 빠르며 꽤 인기를 얻었습니다.
이 튜토리얼에서는 Redis의 작동 방식, 사용 시기, 장치에 설치하는 방법, PHP 웹 애플리케이션에서 캐싱 시스템으로 사용하는 방법에 대한 기본 사항을 알아봅니다.
Redis란 무엇인가요?
Redis는 데이터베이스와 비슷하지만 주로 메모리에 데이터를 저장하는 데이터 저장소입니다. 이는 데이터가 디스크에 저장되는 기존 데이터베이스보다 훨씬 빠릅니다. 이러한 속도 때문에 Redis는 캐싱 도구로 자주 사용됩니다.
Redis는 키-값 쌍 시스템을 사용하여 데이터를 저장하므로 모든 데이터 유형의 데이터를 저장할 수 있습니다. 이는 문서나 행을 사용하는 기존 데이터베이스와도 다릅니다.
Redis 데이터베이스는 데이터베이스의 모든 항목이 키-값 쌍인 큰 JSON 개체로 생각할 수 있습니다. 이는 구조화된 데이터를 저장하기에 가장 적합한 장소가 아닐 수도 있음을 의미합니다.
지속성을 위해 디스크에 데이터를 쓰는 기능이 있으므로 Redis를 데이터베이스로 사용할 수도 있습니다. 주기적으로 또는 실행하는 모든 명령 후에 데이터를 유지하도록 Redis를 구성할 수 있습니다. Redis가 데이터를 유지하도록 구성되지 않으면 매우 불안정하며 시스템 충돌로 인해 데이터가 손실될 수 있습니다.
Redis는 프로덕션 수준 애플리케이션에서 인기가 높으며 Twitter, Github, SnapChat 및 StackOverFlow와 같은 대기업에서 사용됩니다.
- 일회용 비밀번호(OTP):일반적으로 한 번만 사용하도록 생성되며 수명이 짧습니다. Redis의 데이터 만료 날짜 설정 기능을 사용하면 일정 기간이 지나면 OTP를 삭제할 걱정 없이 OTP를 안전하게 보관할 수 있습니다.
- 자주 액세스하는 리소스의 경우:너무 자주 변경되지 않지만 많이 액세스되는 데이터의 경우 Redis를 사용하여 데이터베이스를 쿼리하거나 일부 외부 서비스를 호출하는 데 소요되는 시간을 절약할 수 있습니다.
- 과중한 쿼리의 경우:시간이 걸리고 너무 자주 변경되지 않는 데이터베이스 쿼리의 경우 Redis를 사용하여 원하는 만큼 결과를 저장하여 이 시간을 줄이세요.
Redis 설치 방법
Redis는 모든 운영 체제에 설치할 수 있습니다. macOS, Linux용 Windows 하위 시스템 및 Linux에 대한 지침은 다음과 같습니다.
맥OS
macOS에 Redis를 설치하려면 다음을 실행하세요:
brew install redis
그런 다음 다음 명령을 실행하여 Redis를 시작하십시오:
redis-server
Linux 및 Linux용 Windows 하위 시스템
Redis는 아직 Windows 운영 체제를 정확하게 지원하지 않으므로 Windows에 WSL(Windows Subsystem for Linux)을 설치하여 Linux 환경을 가질 수 있습니다.
Linux에 Redis를 설치하려면 다음을 실행하세요:
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
그런 다음 다음 명령을 실행하여 Redis를 시작하십시오:
sudo service redis-server start
이제 Redis가 설치되었으므로 redis-cli ping를 실행하여 테스트할 수 있습니다. . 그러면 "PONG"이 출력됩니다. . 다음과 같습니다:
Redis 설치 테스트
Redis 기본
Redis를 REPL 또는 독립형 애플리케이션으로 사용하려면 redis-cli를 실행하세요. . REPL 환경이 열립니다.
데이터 설정 방법
SET를 사용하세요 Redis에서 키 값 쌍을 설정하는 키워드입니다. username를 설정하려면 Zubs 값에 대한 키 , 다음을 실행하세요:
SET username Zubs
키-값 쌍 설정
데이터를 얻는 방법
최근에 저장된 username을 얻으려면 키를 사용하려면 GET을 사용하세요. 키워드는 다음과 같습니다:
GET username
키로 값 가져오기
데이터 삭제 방법
DEL를 사용하여 이전에 저장된 키를 삭제할 수도 있습니다. 키워드는 다음과 같습니다:
DEL username
키로 값 삭제
값이 존재하는지 확인하는 방법
EXISTS를 사용하여 키의 존재를 확인할 수 있습니다. 키워드. 0을 반환합니다. 키가 존재하지 않고 1인 경우 그렇다면. 최근 삭제된 username이 있는지 확인하여 테스트할 수 있습니다. 키가 존재합니다. 다음과 같습니다:
키의 수명을 설정하는 방법
Redis를 사용하면 일부 키를 생성할 때 키가 얼마나 오랫동안 존재해야 하는지 지정할 수 있습니다. 이것은 Redis의 정말 훌륭한 기능 중 하나입니다. 이렇게 하려면 SETEX을 사용하세요. 키워드는 다음과 같습니다:
SETEX key seconds value
TTL를 사용하여 특정 키의 수명을 확인할 수 있습니다. 키워드. 그러면 -1이 반환됩니다. 키에 설정된 만료 시간이 없으면 무기한 저장됩니다. -2을 반환합니다. 키가 존재하지 않는 경우. 그리고 키가 존재하면 시간을 초 단위로 반환합니다.
EXPIRE을 사용하여 만료 시간 없이 이전에 생성된 키의 만료 시간을 초 단위로 설정할 수 있습니다. 키워드. 예를 들어 age 변수를 저장하는 키를 생성하세요. 값이 26인 경우 .
SET age 26
그런 다음 만료 시간을 10초로 설정하세요.
EXPIRE age 20
남은 수명을 몇 번 반복해서 확인하여 실제로 얼마나 줄어들고 결국에는 다시 존재하지 않는지 확인하세요.
Redis를 사용하여 간단한 애플리케이션을 구축하는 방법
Redis의 작동 방식을 이해하는 데 도움이 되도록 이제 Redis를 사용하여 데이터를 캐시하여 응답을 더 빠르게 로드하는 기본 웹 애플리케이션을 구축하겠습니다. JSONPlaceholder에서 이미지 데이터를 가져와서 반환하는 간단한 애플리케이션을 구축하게 됩니다.
Composer를 사용하여 새 PHP 프로젝트 만들기
프로젝트에 대한 새 폴더를 생성하고 새로 생성된 폴더로 디렉터리를 변경한 후 다음 화합물을 실행하여 새 작곡가 프로젝트를 생성합니다.
composer init -q
그러면 새로운 composer.json이 생성됩니다. 파일은 다음과 같아야 합니다:
{
"require": {}
}
다음으로, 공용 코드 파일을 보관할 공용 폴더를 만듭니다. 그런 다음 새 index.php를 만듭니다. 폴더에 파일이 있습니다.
지금은 PHP 파일에 일부 상용구 내용을 넣고 서버를 시작하세요.
<?php
echo "Hello World!";
php -S localhost:8080
간단한 라우터 설치 및 요청 처리
프로젝트를 완료하려면 간단한 PHP 라우터 Altorouter를 설치하세요. 및 웹 클라이언트 Guzzlehttp .
composer require altorouter/altorouter guzzlehttp/guzzle
index.php 업데이트 이 코드를 포함하려면:
<?php
// Import composer autoload file
require_once __DIR__ . '/../vendor/autoload.php';
// Import GuzzleHttp Client
use GuzzleHttp\Client;
// Instantiate router and web client
$router = new AltoRouter();
$client = new Client();
// Register Sample route
$router->map('GET', '/', function () {
// Set response Content-Type
header('Content-Type: application/json; charset=utf-8');
// Return basic response
echo json_encode(['data' => 'Hello World']);
});
/**
* Route to get all photos
*/
$router->map('GET', '/photos', function () use ($client) {
// Make request to JSONPlaceholder
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($response->getBody()->getContents())
]);
});
/**
* Route to get single photo by id
*/
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($response->getBody()->getContents())
]);
});
$match = $router->match();
if( is_array($match) && is_callable( $match['target'] ) ) {
call_user_func_array( $match['target'], $match['params'] );
} else {
// no route was matched
header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
코드는 매우 자명합니다. 그러나 명확성을 위해 여기에 분석이 있습니다. 1-11행에서 필수 클래스 GuzzleHttp 및 AltoRouter를 가져오고 인스턴스화합니다.
14-20행에서 "Hello World!"를 반환하는 간단한 클로저와 함께 첫 번째 경로가 등록됩니다. 25-45행은 경로 두 개를 더 등록합니다. 하나는 모든 사진을 가져오는 경로입니다(/photos). 사진 한 장을 가져오는 또 다른 하나, /photos/id .
경로 선언에 설정된 클로저를 실제로 실행하려면 라우터 패키지의 문서를 기반으로 마지막 줄이 필요합니다.
Postman을 사용하여 이러한 경로를 테스트할 수 있습니다.
Hello World 경로
모든 사진 가져오기 경로
단일 사진 경로 가져오기
/photos 경로는 요청당 평균 1400ms가 소요됩니다. /photos/id 요청당 평균 900ms가 소요됩니다.
Redis 설치 및 인스턴스화
원래 요청의 결과를 JSONPlaceholder에 캐시한 다음 매번 요청하는 대신 캐시에서 응답을 반환하면 이러한 시간을 줄일 수 있습니다.
Redis를 PHP와 함께 사용하려면 PhpRedis 확장을 설치하세요. 이 확장은 Redis와 통신하기 위한 API를 제공합니다. 다음 명령을 사용하여 쉽게 설치할 수 있습니다:
pecl install redis
설치 후에는 PHP 프로젝트에서 이 클래스를 사용할 수 있습니다. 클래스를 가져와 index.php 상단에서 인스턴스화합니다. 파일:
$redis = new Redis();
$redis->connect('127.0.0.1');
이 작업을 완료하면 이제 프로젝트에서 Redis를 사용할 수 있습니다.
Redis로 데이터를 캐시하는 방법
JSONPlaceholder에서 반환된 원시 JSON 응답을 만료 시간 1시간(3600초)으로 Redis에 저장합니다.
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
$redis->setex(
'photos',
3600,
$response->getBody()->getContents()
);
여기서 photos라는 새 키를 만듭니다. , 만료 시간을 1시간으로 지정한 다음 JSONPlaceholder에서 얻은 원시 응답을 할당합니다.
하지만 이 시점에서도 API가 응답하는 데 여전히 오랜 시간이 걸립니다. 이는 이 응답을 저장하기만 하고 Redis를 사용하여 응답을 반환하지 않기 때문입니다.
이 문제를 해결하려면 새로운 요청이 들어올 때 메모리에 이전에 저장되어 있는 일부 데이터가 있는지 확인하세요. 그렇다면 메모리 내 데이터를 반환하고, 그렇지 않으면 JSONPlaceholder를 호출합니다.
/photos 업데이트 다음을 차단하세요:
/**
* Route to get all photos
*/
$router->map('GET', '/photos', function () use ($client, $redis) {
// Check if Redis has the key
if (!$redis->exists('photos')) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos');
// Store the data for next use
$redis->setex(
'photos',
REDIS_STANDARD_EXPIRY,
$response->getBody()->getContents()
);
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($redis->get('photos'))
]);
});
개선 사항을 확인하기 위해 Postman에서 테스트하면 /photos에 대한 첫 번째 호출(캐시되기 전의 원래 호출) 후 평균 응답 시간이 평균 20ms로 떨어진 것을 볼 수 있습니다. 경로. 이는 50배 이상 향상된 것입니다. Redis는 처리 시간과 전력을 크게 절약해 줍니다.
/photos/id 업데이트 Redis도 사용하려면 다음 경로를 따르세요:
$router->map('GET', '/photos/[i:id]', function (int $id) use ($client, $redis) {
if (!$redis->exists('photos:' . $id)) {
$response = $client->request('GET', 'https://jsonplaceholder.typicode.com/photos/' . $id);
$redis->setex(
'photos:' . $id,
REDIS_STANDARD_EXPIRY,
$response->getBody()->getContents()
);
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => json_decode($redis->get('photos:' . $id))
]);
});
/photos/id 이제 Route는 응답을 받는 데 5ms도 채 걸리지 않아 훨씬 더 빨라져 45배 이상 향상되었습니다.
요약
이제 Redis가 무엇인지, 기본 사항과 Redis를 사용하여 PHP 웹 애플리케이션의 속도를 향상시킬 수 있는 방법을 이해하셨기를 바랍니다. 이 글에 사용된 코드 파일은 GitHub에서 찾을 수 있습니다.
질문이나 관련 조언이 있으면 저에게 연락해 공유해 주세요.
내 기사를 더 많이 읽거나 내 작업을 팔로우하려면 LinkedIn, Twitter 및 Github에서 나와 연결할 수 있습니다. 빠르고 쉬우며 무료입니다!
무료로 코딩을 배우세요. freeCodeCamp의 오픈 소스 커리큘럼은 40,000명 이상의 사람들이 개발자로 취업하는 데 도움을 주었습니다. 시작하세요