ユニバーサルキャッシングテクノロジー
データ キャッシュ: ここで言うデータ キャッシュは、ページがアクセスされるたびに、まず対応するキャッシュ データが存在するかどうかを検出し、データベースに接続してデータを取得し、シリアル化します。クエリ結果をファイルに保存すると、今後は同じクエリ結果がキャッシュ テーブルまたはファイルから直接取得されます。
最も広く使用されている例は、結果 ID をテーブルにキャッシュし、次回同じキーワードを検索するときに最初にキャッシュ テーブルを検索する Discuz の検索機能です。
一般的な方法として、複数のテーブルを関連付ける場合、アタッチされたテーブルの内容を配列に生成し、必要に応じて配列を分解することができます。ただし、欠点は、2 つのデータの同期にはさらに多くの手順が必要であり、速度のためにハードディスクを犠牲にすることが常にボトルネックになることです。
ページキャッシュ:
ページにアクセスされるたびに、まず対応するキャッシュされたページ ファイルが存在するかどうかを検出し、存在しない場合はデータベースに接続してデータを取得し、ページを表示すると同時にキャッシュされたページ ファイルを生成します。これにより、次回アクセスしたときにページ ファイルが有効になります。 (インターネット上のテンプレート エンジンと一部の一般的なキャッシュ クラスには通常、この機能があります)
時間トリガー型キャッシュ:
ファイルが存在し、タイムスタンプが設定された有効期限よりも小さいかどうかを確認します。ファイル変更タイムスタンプが現在のタイムスタンプから有効期限タイムスタンプを引いた値より大きい場合は、キャッシュを使用し、それ以外の場合はキャッシュを更新します。
コンテンツトリガーのキャッシュ:
データの挿入または更新時にキャッシュを強制的に更新します。
静的キャッシュ:
ここでいう静的キャッシュとは、HTMLやXMLなどのテキストファイルを静的に直接生成し、更新があったときに再生成するものを指しますので、あまり変更のないページに適していますので、ここでは説明しません。
上記の内容はコードレベルのソリューションであり、他のフレームワークを直接変更するのは面倒なので、簡単に実行でき、いくつかの方法で使用できます。コードレベルではなく、サイドキャッシュソリューションです。これを達成するには複数の関係者の協力が必要です。
メモリキャッシュ:
Memcached は、データベースの負荷を軽減し、動的アプリケーションのアクセス速度を向上させるために使用される、高性能の分散メモリ オブジェクト キャッシング システムです。
Memcached の例を次に示します。
<?php
$memcache = 新しい 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('key');
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', 'test', 'test');
mysql_select_db('テスト');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
//データベースから取得した結果セットのデータを、次回のアクセス時に使用するために memcached に保存します。
$mc->add($key, $datas);
} それ以外 {
echo "n".str_pad('memcached からデータを読み取ります。', 60, '_')."n";
}
var_dump($datas);
?>
PHPバッファ:
eaccelerator、apc、phpa、xcache などがありますが、これらについては詳しく説明しませんので、そのようなものがあることを知っていれば問題ありません。
MYSQL キャッシュ:
これは、非コード レベルとも考えられます。実行時間は、2G MYISAM テーブルに基づいて、my.ini の変更された部分に基づいて以下に掲載します。 0.05Sあたりで1年近く交換したそうです。
[クライアント]
…
デフォルトの文字セット=gbk
デフォルトストレージエンジン=MYISAM
max_connections=600
max_connect_errors=500
back_log=200
インタラクティブタイムアウト=7200
クエリキャッシュサイズ=64M
…
テーブルキャッシュ=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
リバース プロキシ ベースの Web キャッシュ:
Nginx、SQUID、mod_proxyなど(apache2以降はmod_proxyとmod_cacheに分かれています)
NGINX の例
<nginx.conf>
#ユーザー誰もいない;
ワーカープロセス 4;
error_log ログ/error.log crit;
pid ログ/nginx.pid;
ワーカー_rlimit_nofile 10240;
イベント {
epoll を使用します。
ワーカー接続 51200;
}
http {
mime.types を含めます。
デフォルトタイプアプリケーション/オクテットストリーム;
ファイルを送信します。
キープアライブタイムアウト 65;
tcp_nolay がオン。
# サーバープール
アップストリーム 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;
}
アップストリーム bspsellersvr {
サーバー 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;
位置/{
proxy_pass http://bspimgsvr ;
proxy_setting.conf を含めます。
}
access_log ログ/img.log test_com;
}
#style.test.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 style.test.com;
位置/{
proxy_pass http://bspstylesvr ;
proxy_setting.conf を含めます。
}
access_log ログ/style.log test_com;
}
#help.test.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 help.test.com;
位置/{
proxy_pass http://bsphelpsvr ;
proxy_setting.conf を含めます。
}
access_log ログ/help.log test_com;
}
#admin.test.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 admin.test.com;
位置/{
proxy_pass http://bspadminsvr ;
proxy_setting.conf を含めます。
}
access_log ログ/admin.log test_com;
}
#バイヤー.テスト.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 購入者.test.com;
位置/{
proxy_pass http://bspbuyersvr ;
proxy_setting.conf を含めます。
}
access_log ログ/buyer.log test_com;
}
#seller.test.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名売り手.test.com;
位置/{
proxy_pass http://bspsellersvr ;
proxy_setting.conf を含めます。
}
access_log ログ/seller.log test_com;
}
#wsi.test.com
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 wsi.test.com;
位置/{
proxy_pass 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/ {
スタブステータスがオン。
アクセス_ログオフ;
}
位置/{
proxy_pass http://bspfrontsvr ;
proxy_setting.conf を含めます。
}
access_log ログ/www.log test_com;
エラーページ 500 502 503 504 /50x.html;
場所 = /50x.html {
ルートhtml;
}
}
#login.test.com
サーバー {
10.10.10.230:443 を聞いてください。
サーバー名 ログイン.test.com;
SSL オン。
ssl_certificate cert.pem;
ssl_certificate_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 がオン。
位置/{
proxy_pass https://bsploginsvr ;
proxy_setting.conf を含めます。
}
access_log ログ/login.log test_com;
}
#login.test.com 登録用
サーバー {
10.10.10.230:80 を聞いてください。
サーバー名 ログイン.test.com;
位置/{
proxy_pass 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;
プロキシ接続タイムアウト 90;
プロキシ送信タイムアウト 90;
プロキシ読み取りタイムアウト 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
mod_proxy の例:
<仮想ホスト *>
サーバー名www.zxsv.com
ServerAdmin [email protected]
# リバースプロキシ設定
プロキシパス / http://www.zxsv.com:8080/
ProxyPassReverse/ http://www.zxsv.com:8080 /
# キャッシュディレクトリルート
CacheRoot「/var/www/proxy」
# 最大キャッシュストレージ
キャッシュサイズ 50000000
# 時間: 4 時間ごと
キャッシュGc間隔4
# ページの最大有効期限: 時間
キャッシュ最大期限 240
# 有効期限 = (現在 – last_modified) * CacheLastModifiedFactor
キャッシュ最終変更ファクター 0.1
# デフォルトの有効期限タグ: 時間
キャッシュデフォルト期限切れ 1
# コンテンツの割合が取得された後に強制的に完了: 60-90%
キャッシュフォース完了80
CustomLog /usr/local/apache/logs/dev_access_log の結合
</仮想ホスト>
SQUID の例については説明しません。これに関する記事はインターネット上にたくさんありますので、ご自身で検索してください。
DNSポーリング:
BIND はオープン ソースの DNS サーバー ソフトウェアです。これは、自分で検索するだけで、誰もがその存在を知っています。
chinacache などの一部の大規模 Web サイトでは、これを行っていることを知っています。簡単に言うと、同じページまたはファイルが異なるサーバーにキャッシュされ、北と南に応じて適切なサーバーに自動的に解析されます。