범용 캐싱 기술
데이터 캐시: 여기서 언급하는 데이터 캐시는 데이터베이스 쿼리 캐시를 의미합니다. 페이지에 액세스할 때마다 해당 캐시된 데이터가 존재하는지 먼저 감지하고, 데이터베이스에 연결하여 데이터를 얻은 후 직렬화합니다. 쿼리 결과를 파일에 저장하면 나중에 동일한 쿼리 결과를 캐시 테이블이나 파일에서 직접 얻을 수 있습니다.
가장 널리 사용되는 예는 Discuz의 검색 기능으로, 다음에 동일한 키워드를 검색할 때 결과 ID를 테이블에 캐시하고 캐시 테이블을 먼저 검색하는 기능입니다.
일반적인 방법으로는 여러 개의 테이블을 연관시킬 때 첨부된 테이블의 내용을 배열로 생성하고, 필요할 경우 배열을 분해하여 하나의 테이블만 사용할 수 있다는 장점이 있습니다. 읽을 수 있지만 단점은 두 데이터 동기화가 더 많은 단계를 거쳐야 하며 데이터베이스가 항상 병목 현상이 발생한다는 것입니다. 속도를 위해 하드 디스크를 거래하는 것이 핵심입니다.
페이지 캐시:
페이지에 액세스할 때마다 먼저 해당 캐시된 페이지 파일이 있는지 여부를 감지합니다. 존재하지 않는 경우 데이터베이스에 연결하여 데이터를 가져오고 동시에 페이지를 표시하며 캐시된 페이지 파일을 생성합니다. 다음에 방문할 때 페이지 파일이 재생되도록 합니다. (템플릿 엔진과 인터넷의 일부 일반적인 캐시 클래스에는 일반적으로 이 기능이 있습니다.)
시간 트리거 캐시:
파일이 존재하는지, 타임스탬프가 설정된 만료 시간보다 짧은지 확인하세요. 파일 수정 타임스탬프가 현재 타임스탬프에서 만료 타임스탬프를 뺀 값보다 큰 경우 캐시를 사용하고, 그렇지 않으면 캐시를 업데이트하세요.
콘텐츠 트리거 캐싱:
데이터가 삽입되거나 업데이트될 때 캐시를 강제로 업데이트합니다.
정적 캐시:
여기서 언급하는 정적 캐시는 HTML이나 XML 등의 텍스트 파일을 직접 생성하여 업데이트 시 다시 생성하는 정적 캐시를 의미하므로 크게 변경되지 않는 페이지에 적합하므로 여기서는 다루지 않겠습니다.
위의 내용은 코드 수준의 솔루션으로 다른 프레임워크를 직접 CP하여 변경하기가 너무 어렵습니다. 내용은 거의 동일하며 여러 가지 방법으로 사용할 수 있습니다. -코드 수준이 아닌 측면 캐싱 솔루션을 달성하려면 여러 당사자의 협력이 필요합니다.
메모리 캐시:
Memcached는 동적 애플리케이션에서 데이터베이스 로드를 줄이고 액세스 속도를 향상시키는 데 사용되는 고성능 분산 메모리 개체 캐싱 시스템입니다.
Memcached의 예는 다음과 같습니다.
<?php
$memcache = 새로운 멤캐시;
$memcache->connect('localhost', 11211) 또는 die ("연결할 수 없습니다");
$version = $memcache->getVersion();
echo "서버 버전: ".$version."n";
$tmp_object = 새로운 stdClass;
$tmp_object->str_attr = '테스트';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) 또는 die(“서버에 데이터를 저장하지 못했습니다.”);
echo "캐시에 데이터를 저장합니다(데이터는 10초 후에 만료됩니다)n";
$get_result = $memcache->get('키');
echo "캐시 데이터:n";
var_dump($get_result);
?>
도서관 읽기의 예:
<?php
$sql = 'SELECT * FROM 사용자';
$key = md5($sql); //memcached 객체 식별자
if ( !($datas = $mc->get($key)) ) {
// memcached에서 캐시된 데이터를 얻지 못한 경우 데이터베이스 쿼리를 사용하여 레코드 세트를 얻습니다.
echo "n".str_pad('MySQL에서 데이터를 읽습니다.', 60, '_')."n";
$conn = mysql_connect('localhost', '테스트', '테스트');
mysql_select_db('테스트');
$결과 = mysql_query($sql);
동안($row = mysql_fetch_object($result))
$datas[] = $행;
//다음 접속 시 사용할 수 있도록 데이터베이스에서 얻은 결과 세트 데이터를 memcached에 저장합니다.
$mc->추가($key, $datas);
} 또 다른 {
echo "n".str_pad('memcached에서 데이터를 읽습니다.', 60, '_')."n";
}
var_dump($datas);
?>
PHP 버퍼:
eaccelerator, apc, phpa 및 xcache에 대해서는 언급하지 않겠습니다. 그런 것이 있다는 것을 알고 있으면 괜찮습니다.
MYSQL 캐시:
이것은 또한 코드 수준이 아닌 것으로 간주됩니다. 클래식 데이터베이스는 이 방법을 사용합니다. 아래의 실행 시간을 보세요. 2G MYISAM 테이블을 기반으로 my.ini의 수정된 부분을 기반으로 0.09xxx와 같은 섹션을 게시할 것입니다. 0.05S쯤 되면 거의 1년 정도 바꿨다고 하네요.
[고객]
…
기본 문자 집합=gbk
기본 스토리지 엔진=MYISAM
max_connections=600
max_connect_errors=500
back_log=200
Interactive_timeout=7200
query_cache_size=64M
…
table_cache=512
…
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=128M
key_buffer_size=1024M
read_buffer_size=512M
…
thread_concurrency=8
역방향 프록시 기반 웹 캐싱:
Nginx, SQUID, mod_proxy 등 (Apache2 이상은 mod_proxy, mod_cache로 구분됩니다)
NGINX 예시
<nginx.conf>
#사용자 없음;
작업자 프로세스 4;
error_log 로그/error.log crit;
pid 로그/nginx.pid;
작업자_r한계_no파일 10240;
이벤트 {
epoll을 사용하십시오;
작업자 연결 51200;
}
http {
mime.types를 포함합니다.
default_type 애플리케이션/옥텟-스트림;
파일 보내기;
keepalive_timeout 65;
tcp_nodelay 켜기;
# 서버 풀
업스트림 bspfrontsvr {
서버 10.10.10.224:80 가중치=1;
서버 10.10.10.221:80 가중치=1;
}
업스트림 bspimgsvr {
서버 10.10.10.201:80 가중치=1;
}
업스트림 bspstylesvr {
서버 10.10.10.202:80 가중치=1;
}
업스트림 bsphelpsvr {
서버 10.10.10.204:80 가중치=1;
}
업스트림 bspwsisvr {
서버 10.10.10.203:80 가중치=1;
}
업스트림 bspadminsvr {
서버 10.10.10.222:80 가중치=1;
}
업스트림 bspbuyersvr {
서버 10.10.10.223:80 가중치=1;
}
업스트림 bspellervr {
서버 10.10.10.225:80 가중치=1;
}
업스트림 bsploginsvr {
서버 10.10.10.220:443 가중치=1;
}
업스트림 bspregistersvr {
서버 10.10.10.220:80 가중치=1;
}
log_format test_com '$remote_addr – $remote_user [$time_local] “$request” '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" ';
#——————————————————————–
#img.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버 이름 img.test.com;
위치/{
프록시패스 http://bspimgsvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/img.log test_com;
}
#style.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버 이름 style.test.com;
위치/{
프록시 패스 http://bspstylesvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/style.log test_com;
}
#help.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버 이름 help.test.com;
위치/{
프록시패스 http://bsphelpsvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/help.log test_com;
}
#admin.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버_이름 admin.test.com;
위치/{
프록시 패스 http://bspadminsvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/admin.log test_com;
}
#구매자.test.com
서버 {
10.10.10.230:80을 들어보세요;
server_name 구매자.test.com;
위치/{
프록시패스 http://bspbuyersvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/buyer.log test_com;
}
#seller.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버 이름 Seller.test.com;
위치/{
Proxy_pass http://bspellervr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/seller.log test_com;
}
#wsi.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버 이름 wsi.test.com;
위치/{
프록시패스 http://bspwsisvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/wsi.log test_com;
}
#www.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버_이름 www.test.com *.test.com;
위치 ~ ^/NginxStatus/ {
stub_status 켜기;
access_log off;
}
위치/{
프록시패스 http://bspfrontsvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/www.log test_com;
error_page 500 502 503 504 /50x.html;
위치 = /50x.html {
루트html;
}
}
#login.test.com
서버 {
10.10.10.230:443을 들어보세요;
서버_이름 login.test.com;
SSL 켜짐;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5분;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers 켜기;
위치/{
프록시패스 https://bsploginsvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/login.log test_com;
}
등록을 위한 #login.test.com
서버 {
10.10.10.230:80을 들어보세요;
서버_이름 login.test.com;
위치/{
프록시패스 http://bspregistersvr ;
Proxy_setting.conf를 포함합니다.
}
access_log 로그/register.log test_com;
}
}
<conf/proxy_setting.conf>
Proxy_redirect 꺼짐;
Proxy_set_header 호스트 $host;
Proxy_set_header X-Real-IP $remote_addr;
Proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
Proxy_connect_timeout 90;
Proxy_send_timeout 90;
Proxy_read_timeout 90;
Proxy_buffer_size 4k;
프록시_버퍼 4 32k;
Proxy_busy_buffers_size 64k;
Proxy_temp_file_write_size 64k;
mod_proxy의 예:
<가상호스트 *>
서버 이름 www.zxsv.com
서버관리자 [email protected]
# 역방향 프록시 설정
ProxyPass / http://www.zxsv.com:8080/
ProxyPassReverse/ http://www.zxsv.com:8080 /
# 캐시 디렉토리 루트
CacheRoot "/var/www/proxy"
# 최대 캐시 저장 공간
캐시 크기 50000000
#시간: 4시간마다
캐시Gc간격 4
# 최대 페이지 만료 시간: 시간
캐시 최대 만료 240
# 만료 시간 = (현재 – last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# 기본 만료 태그: 시간
캐시기본값 만료 1
# 검색된 콘텐츠 비율 이후 강제 완료: 60-90%
CacheForceCompletion80
CustomLog /usr/local/apache/logs/dev_access_log 결합
</VirtualHost>
SQUID의 예에 대해서는 설명하지 않겠습니다. 인터넷에 이에 대한 기사가 너무 많습니다.
DNS 폴링:
BIND는 오픈 소스 DNS 서버 소프트웨어입니다. 직접 검색해 보면 누구나 그 존재를 알 수 있습니다.
chinacache 같은 일부 대형 웹사이트에서는 이렇게 하는 것으로 알고 있는데, 간단히 말하면 동일한 페이지나 파일이 서로 다른 서버에 캐시되어 북쪽과 남쪽에 따라 해당 서버로 자동으로 파싱되는 것입니다.