캐싱 전략¶
개요¶
Rhymix에서 제공하는 다양한 캐싱 기능과 최적화 전략을 소개합니다.
Rhymix 캐싱 시스템¶
1. Object Cache¶
메모리 기반 캐싱으로 빠른 데이터 접근을 제공합니다.
// Redis 설정
$rx_defaults->cache = array(
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'dbindex' => 1,
);
// Memcached 설정
$rx_defaults->cache = array(
'type' => 'memcached',
'servers' => array(
array('127.0.0.1', 11211, 1),
),
);
2. Template Cache¶
템플릿 컴파일 결과를 캐싱하여 성능을 향상시킵니다.
// 템플릿 캐시 사용
Context::set('use_template_cache', true);
// 특정 템플릿 캐시 무효화
FileHandler::removeFilesInDir('./files/cache/template');
3. Query Cache¶
데이터베이스 쿼리 결과를 캐싱합니다.
// 쿼리 캐시 사용
$output = executeQueryArray('module.getDocumentList', $args, $cache_key);
// 캐시 TTL 설정
$output = executeQueryArray('module.getDocumentList', $args, array(
'cache_key' => $cache_key,
'cache_ttl' => 3600 // 1시간
));
페이지 캐싱¶
Full Page Cache¶
전체 페이지를 캐싱하여 서버 부하를 줄입니다.
// 페이지 캐시 설정
$rx_defaults->cache['pages'] = array(
'enabled' => true,
'ttl' => 3600,
'exclude' => array('admin', 'member'),
);
Fragment Cache¶
페이지의 일부분만 캐싱합니다.
// 위젯 캐싱
{@
$cache_key = 'widget_recent_documents_' . $module_srl;
$cached_content = CacheHandler::get($cache_key);
}
<!--@if(!$cached_content)-->
{@$widget_content = Widget::execute('content', $widget_args)}
{@CacheHandler::put($cache_key, $widget_content, 3600)}
<!--@else-->
{@$widget_content = $cached_content}
<!--@end-->
{$widget_content}
정적 리소스 캐싱¶
CSS/JS 최적화¶
// 자동 병합 및 압축 설정
$rx_defaults->optimize = array(
'minify_css' => true,
'minify_js' => true,
'concat_css' => true,
'concat_js' => true,
);
이미지 캐싱¶
# .htaccess 설정
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif|ico)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule>
데이터베이스 최적화¶
인덱스 최적화¶
-- 자주 사용되는 쿼리에 인덱스 추가
CREATE INDEX idx_document_list ON documents(module_srl, status, list_order);
CREATE INDEX idx_comment_list ON comments(document_srl, status);
쿼리 최적화¶
// 필요한 컬럼만 선택
$columnList = array('document_srl', 'title', 'regdate');
$output = DocumentModel::getDocumentList($args, $columnList);
// JOIN 최적화
$query = DB::table('documents')
->select(['documents.*', 'member.nick_name'])
->leftJoin('member', 'documents.member_srl', '=', 'member.member_srl')
->where('module_srl', $module_srl)
->limit(20);
CDN 활용¶
정적 파일 CDN 설정¶
// config/config.user.inc.php
$rx_defaults->cdn = array(
'url' => 'https://cdn.example.com',
'include' => array(
'common/css/*',
'common/js/*',
'modules/*/tpl/css/*',
'modules/*/tpl/js/*',
'files/attach/*',
),
);
동적 콘텐츠 CDN¶
// CloudFlare Page Rules 예시
/*
Cache Level: Cache Everything
Edge Cache TTL: 1 hour
*/
캐시 무효화 전략¶
자동 무효화¶
// 문서 수정 시 관련 캐시 자동 삭제
function afterUpdateDocument($obj) {
CacheHandler::delete('document_' . $obj->document_srl);
CacheHandler::delete('document_list_' . $obj->module_srl);
}
수동 무효화¶
// 특정 캐시 삭제
CacheHandler::delete($cache_key);
// 패턴으로 캐시 삭제
CacheHandler::deleteByPrefix('widget_*');
// 전체 캐시 비우기
CacheHandler::truncate();
모니터링 및 디버깅¶
캐시 히트율 확인¶
// 캐시 통계 확인
$stats = CacheHandler::getStatistics();
debugPrint($stats);
성능 프로파일링¶
// 실행 시간 측정
$start_time = microtime(true);
// ... 코드 실행 ...
$execution_time = microtime(true) - $start_time;
debugPrint("Execution time: {$execution_time}s");
모범 사례¶
- 적절한 TTL 설정: 콘텐츠 특성에 맞는 캐시 유효 시간 설정
- 캐시 워밍: 중요한 페이지는 미리 캐시 생성
- 캐시 키 설계: 고유하고 의미 있는 캐시 키 사용
- 모니터링: 캐시 효율성을 지속적으로 모니터링