일반적인 캐싱 기술
데이터 캐시: 여기서 언급하는 데이터 캐시는 페이지에 접속할 때마다 해당 캐시 데이터가 존재하는지 먼저 감지하여 연결합니다. 데이터베이스를 가져와 데이터를 가져오고 쿼리 결과를 직렬화하여 파일에 저장합니다. 앞으로는 동일한 쿼리 결과를 캐시 테이블이나 파일에서 직접 얻을 수 있습니다.
가장 널리 사용되는 예는 Discuz의 검색 기능으로, 다음에 동일한 키워드를 검색할 때 결과 ID를 테이블에 캐시하고 캐시 테이블을 먼저 검색하는 기능입니다.
일반적인 방법은 여러 개의 테이블이 연관되어 있는 경우 배열을 생성하고, 첨부된 테이블의 내용을 기본 테이블의 필드에 저장하는 것입니다. 이 방법의 장점은 하나의 테이블만 가능하다는 것입니다. 읽을 수 있지만 단점은 두 데이터를 동기화하는 데 더 많은 단계가 있다는 것입니다. 데이터베이스는 항상 속도를 위해 병목 현상을 발생시키는 것이 핵심입니다.
페이지 캐싱:
페이지에 액세스할 때마다 먼저 해당 캐시된 페이지 파일이 있는지 여부를 감지합니다. 존재하지 않는 경우 데이터베이스에 연결하여 데이터를 가져오고 동시에 페이지를 표시하며 캐시된 페이지 파일을 생성합니다. 다음에 방문할 때 페이지 파일이 재생되도록 합니다. (템플릿 엔진과 인터넷의 일부 일반적인 캐시 클래스에는 일반적으로 이 기능이 있습니다.)
시간 트리거 캐시:
파일이 존재하는지, 타임스탬프가 설정된 만료 시간보다 짧은지 확인하세요. 파일 수정 타임스탬프가 현재 타임스탬프에서 만료 타임스탬프를 뺀 값보다 큰 경우 캐시를 사용하고, 그렇지 않으면 캐시를 업데이트하세요.
콘텐츠 트리거 캐싱:
데이터가 삽입되거나 업데이트될 때 캐시를 강제로 업데이트합니다.
정적 캐시:
여기서 언급하는 정적 캐시는 HTML이나 XML 등의 텍스트 파일을 직접 생성하여 업데이트 시 다시 생성하는 정적 캐시를 의미하므로 크게 변경되지 않는 페이지에 적합하므로 여기서는 다루지 않겠습니다.
위 내용은 코드 수준의 솔루션입니다. 다른 프레임워크를 직접 CP하고 변경하기가 너무 게으릅니다. 내용도 비슷하고, 하기 쉽고, 여러 가지 방법으로 사용할 수 있지만, 다음 내용은 서버 측 캐싱 솔루션, 비코드 수준에서는 여러 당사자의 협력이 필요합니다.
메모리 캐시:
Memcached는 동적 애플리케이션에서 데이터베이스 로드를 줄이고 액세스 속도를 향상시키는 데 사용되는 고성능 분산 메모리 개체 캐싱 시스템입니다.
Memcached의 예는 다음과 같습니다.
-
- $memcache = new Memcache;
- $memcache->connect('localhost', 11211) 또는 사망( "연결할 수 없습니다.");
- $version = $memcache->getVersion();
- echo "서버 버전: ".$version."n";
- $tmp_object = new stdClass;
- $tmp_object->str_attr = 'test';
- $tmp_object->int_attr = 123;
- $memcache->set('key', $tmp_object, false, 10) 또는 die("실패했습니다. 서버에 데이터 저장");
- echo "데이터를 캐시에 저장(데이터는 10초 후에 만료됨)n";
- $get_result = $memcache->get('key');
- echo "캐시 데이터:n";
- var_dump($get_result);
- ?>
코드 복사
읽기 라이브러리의 예 :
-
- $sql = 'SELECT * FROM users';
- $key = md5($sql) //memcached 객체 식별자
- if ( !($datas = $mc->get($key)) ) {
- // memcached에서 캐시된 데이터를 가져오지 못한 경우 데이터베이스 쿼리를 사용하여 레코드 세트를 가져옵니다.
- echo "n".str_pad('MySQL에서 데이터를 읽습니다.', 60, '_')."n";
- $conn = mysql_connect('localhost', 'test', 'test');
- mysql_select_db('test');
- $result = mysql_query($sql);
- while ($row = mysql_fetch_object($result))
- $datas[] = $row;
- //다음 접속 시 사용할 수 있도록 데이터베이스에서 얻은 결과 세트 데이터를 memcached에 저장합니다.
- $mc->add($key, $datas);
- } else {
- echo "n".str_pad('memcached에서 데이터를 읽습니다.', 60, '_')."n ";
- }
- var_dump($datas);
- ?>
코드 복사
php 버퍼:
eaccelerator, apc, phpa, xcache 등이 있습니다. 이것저것 검색해서 직접 확인해 보세요.
MYSQL 캐시:
이는 코드 수준이 아닌 것으로 간주됩니다. 클래식 데이터베이스는 이 방법을 사용합니다. 아래 실행 시간을 보면 0.09xxx 등입니다.
파란색 옷을 입은 남자가 my.ini를 수정한 부분을 올려보겠습니다. 2G MYISAM 테이블은 거의 1년 동안 수정했다고 합니다
코드 복사 상자
-
- [클라이언트]
- …
- default-character-set=gbk
- default-storage-engine=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 예
mod_proxy의 예:
-
- ServerName www.zxsv.com
- ServerAdmin admin@zxsv.com
- # 역방향 프록시 설정
- ProxyPass / http://www.zxsv.com:8080/
- ProxyPassReverse / http://www.zxsv.com:8080/
- # 캐시 디렉토리 루트
- CacheRoot "/var/www/ 프록시"
- # 최대 캐시 저장 공간
- CacheSize 50000000
- # 시간: 4시간마다
- CacheGcInterval 4
- # 최대 페이지 만료 시간: 시간
- CacheMaxExpire 240
- # 만료 시간 = (현재 - last_modified) * CacheLastModifiedFactor
- CacheLastModifiedFactor 0.1
- # 기본 만료 태그: 시간
- CacheDefaultExpire 1
- # 검색된 콘텐츠의 비율 이후 강제 완료: 60-90%
- CacheForceCompletion 80
- CustomLog /usr/local/apache/logs/dev_access_log 결합
코드 복사
SQUID 예제는 여기를 참조하세요.
DNS 폴링:
BIND는 오픈 소스 DNS 서버 소프트웨어입니다. 직접 검색해 보면 누구나 그 존재를 알 수 있습니다.
chinacache 같은 일부 대형 웹사이트에서는 이렇게 하는 것으로 알고 있는데, 간단히 말하면 동일한 페이지나 파일이 서로 다른 서버에 캐시되어 북쪽과 남쪽에 따라 해당 서버로 자동으로 파싱되는 것입니다.
|