เทคโนโลยีแคชสากล
แคชข้อมูล: แคชข้อมูลที่กล่าวถึงในที่นี้อ้างอิงถึงแคชการสืบค้นฐานข้อมูล ทุกครั้งที่มีการเข้าถึงเพจ อันดับแรกจะตรวจพบว่ามีข้อมูลแคชที่เกี่ยวข้องอยู่หรือไม่ หากไม่มี ให้เชื่อมต่อกับฐานข้อมูล รับข้อมูล และทำให้เป็นอนุกรม ผลลัพธ์การสืบค้น บันทึกลงในไฟล์ และผลลัพธ์การสืบค้นเดียวกันจะได้รับโดยตรงจากตารางแคชหรือไฟล์ในอนาคต
ตัวอย่างที่ใช้กันอย่างแพร่หลายที่สุดคือฟังก์ชันการค้นหาของ Discuz ซึ่งจะแคช ID ผลลัพธ์ลงในตารางและค้นหาตารางแคชก่อนเมื่อค้นหาคำสำคัญเดียวกันในครั้งต่อไป
ตามวิธีการทั่วไป เมื่อมีการเชื่อมโยงหลายตาราง เนื้อหาในตารางที่แนบมาจะถูกสร้างขึ้นเป็นอาร์เรย์และบันทึกลงในฟิลด์ของตารางหลัก เมื่อจำเป็น อาร์เรย์จะถูกแยกย่อย ข้อดีของการทำเช่นนี้คือมีเพียงตารางเดียวเท่านั้นที่สามารถทำได้ สามารถอ่านได้ แต่ข้อเสียคือ การซิงโครไนซ์ข้อมูลสองครั้งจะใช้เวลาหลายขั้นตอน และฐานข้อมูลมักจะเป็นจุดคอขวดในเรื่องนี้
แคชหน้า:
ทุกครั้งที่มีการเข้าถึงเพจ ขั้นแรกจะตรวจสอบว่ามีไฟล์เพจที่แคชไว้หรือไม่ หากไม่มี ก็จะเชื่อมต่อกับฐานข้อมูล รับข้อมูล แสดงเพจ และสร้างไฟล์เพจที่แคชไว้พร้อมๆ กัน เพื่อให้ไฟล์เพจเข้ามาเล่นในครั้งต่อไปที่คุณเยี่ยมชม (เอ็นจิ้นเทมเพลตและคลาสแคชทั่วไปบางคลาสบนอินเทอร์เน็ตมักจะมีฟังก์ชันนี้)
แคชที่เรียกใช้เวลา:
ตรวจสอบว่ามีไฟล์อยู่หรือไม่และการประทับเวลาน้อยกว่าเวลาหมดอายุที่ตั้งไว้ หากการประทับเวลาการแก้ไขไฟล์มีค่ามากกว่าการประทับเวลาปัจจุบันลบด้วยการประทับเวลาการหมดอายุ ให้ใช้แคช มิเช่นนั้นให้อัปเดตแคช
เนื้อหาทริกเกอร์แคช:
บังคับให้อัปเดตแคชเมื่อมีการแทรกหรืออัปเดตข้อมูล
แคชแบบคงที่:
แคชแบบคงที่ที่กล่าวถึงในที่นี้หมายถึงไฟล์ข้อความแบบคงที่ที่สร้างโดยตรง เช่น HTML หรือ XML และการสร้างใหม่เมื่อมีการอัปเดต เหมาะสำหรับหน้าที่มีการเปลี่ยนแปลงไม่มาก ดังนั้นฉันจะไม่พูดถึงมันที่นี่
เนื้อหาข้างต้นเป็นโซลูชันระดับโค้ด ฉันโดยตรง CP เฟรมเวิร์กอื่น ๆ และขี้เกียจเกินไปที่จะเปลี่ยนแปลง เนื้อหาเกือบจะเหมือนกัน - โซลูชันแคชด้านข้าง ไม่ใช่ระดับโค้ด แต่ต้องได้รับความร่วมมือจากหลายฝ่ายเพื่อให้บรรลุเป้าหมาย
แคชหน่วยความจำ:
Memcached คือระบบแคชอ็อบเจ็กต์หน่วยความจำแบบกระจายประสิทธิภาพสูง ซึ่งใช้เพื่อลดภาระฐานข้อมูลและปรับปรุงความเร็วการเข้าถึงในแอปพลิเคชันแบบไดนามิก
นี่คือตัวอย่างของ Memcached:
<?php
$memcache = Memcache ใหม่;
$memcache->connect('localhost', 11211) or 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) or die (“ไม่สามารถบันทึกข้อมูลที่เซิร์ฟเวอร์”);
echo “เก็บข้อมูลไว้ในแคช (ข้อมูลจะหมดอายุใน 10 วินาที)n”;
$get_result = $memcache->get('key');
echo “ข้อมูลจากแคช:n”;
var_dump($get_result);
-
ตัวอย่างการอ่านห้องสมุด:
<?php
$sql = 'เลือก * จากผู้ใช้';
$key = md5($sql); //ตัวระบุวัตถุ memcached
ถ้า ( !($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);
ในขณะที่ ($row = mysql_fetch_object($result))
$datas[] = $แถว;
//บันทึกข้อมูลชุดผลลัพธ์ที่ได้รับจากฐานข้อมูลไปยัง memcached เพื่อใช้ในการเข้าถึงครั้งถัดไป
$mc->เพิ่ม($คีย์, $datas);
} อื่น {
echo "n".str_pad('อ่านข้อมูลจาก memcached.', 60, '_').."n";
-
var_dump($ข้อมูล);
-
บัฟเฟอร์ PHP:
มี eaccelerator, apc, phpa และ xcache ฉันจะไม่พูดถึงสิ่งเหล่านี้
แคช MySQL:
นี่ถือเป็นระดับที่ไม่ใช่โค้ดด้วย ฐานข้อมูล Classic ใช้วิธีนี้ ดูเวลาทำงานด้านล่าง ฉันจะโพสต์ส่วนเช่น 0.09xxx ตามส่วนที่แก้ไขของ my.ini ตามตาราง 2G MYISAM ใช้งานได้ประมาณ 0.05S ว่ากันว่าเปลี่ยนมาเกือบปีแล้ว
[ลูกค้า]
-
ค่าเริ่มต้นชุดอักขระ=gbk
ค่าเริ่มต้น-storage-engine=MYISAM
สูงสุด_การเชื่อมต่อ=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;
ผู้ปฏิบัติงาน_rlimit_nofile 10240;
เหตุการณ์ {
ใช้อีพอล;
ผู้ปฏิบัติงาน_การเชื่อมต่อ 51200;
-
http {
รวม mime.types;
แอปพลิเคชัน default_type / octet-stream;
ส่งไฟล์บน;
Keepalive_หมดเวลา 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;
-
bshelppsvr ต้นน้ำ {
เซิร์ฟเวอร์ 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;
-
bsloginsvr ต้นน้ำ {
เซิร์ฟเวอร์ 10.10.10.220:443 น้ำหนัก=1;
-
bspregistersvr ต้นน้ำ {
เซิร์ฟเวอร์ 10.10.10.220:80 น้ำหนัก=1;
-
log_format test_com '$remote_addr – $remote_user [$time_local] “$คำขอ” '
'$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://bshelppsvr ;
รวม 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;
-
#buyer.test.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://bspellervr ;
รวม 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/ {
stub_status บน;
access_log ปิด;
-
ที่ตั้ง/{
proxy_pass 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;
server_name เข้าสู่ระบบ.test.com;
เปิด SSL;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_โปรโตคอล SSLv2 SSLv3 TLSv1;
ssl_ciphers ทั้งหมด:!ADH:!ส่งออก56:RC4+RSA:+สูง:+ปานกลาง:+ต่ำ:+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;
server_name เข้าสู่ระบบ.test.com;
ที่ตั้ง/{
proxy_pass http://bspreregistersvr ;
รวม proxy_setting.conf;
-
บันทึก access_log/register.log test_com;
-
-
<conf/proxy_setting.conf>
ปิด proxy_redirect;
proxy_set_header โฮสต์ $ โฮสต์;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
ลูกค้า_max_body_size 10m;
ลูกค้า_ร่างกาย_บัฟเฟอร์_ขนาด 128k;
พร็อกซี_เชื่อมต่อ_หมดเวลา 90;
proxy_send_timeout 90;
พร็อกซี_read_หมดเวลา 90;
พร็อกซี_บัฟเฟอร์_ขนาด 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
พร็อกซี_temp_file_write_ขนาด 64k;
ตัวอย่างของ mod_proxy:
<โฮสต์เสมือน *>
ชื่อเซิร์ฟเวอร์ www.zxsv.com
ผู้ดูแลระบบเซิร์ฟเวอร์ [email protected]
# การตั้งค่าพร็อกซีย้อนกลับ
พร็อกซีพาส / http://www.zxsv.com:8080/
ProxyPassReverse/ http://www.zxsv.com:8080 /
# แคช dir root
แคชรูต “/var/www/proxy”
# พื้นที่เก็บข้อมูลแคชสูงสุด
ขนาดแคช 50000000
# ชั่วโมง: ทุก 4 ชั่วโมง
CacheGcช่วงที่ 4
# เวลาหมดอายุสูงสุดของหน้า: ชั่วโมง
แคชแม็กซ์หมดอายุ 240
# เวลาหมดอายุ = (ตอนนี้ – Last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# แท็กหมดอายุเริ่มต้น: ชั่วโมง
แคชค่าเริ่มต้นหมดอายุ 1
# บังคับให้เสร็จสิ้นหลังจากดึงเนื้อหาบางส่วนแล้ว: 60-90%
CacheForce เสร็จสมบูรณ์ 80
CustomLog /usr/local/apache/logs/dev_access_log รวมกัน
</โฮสต์เสมือน>
ฉันจะไม่อธิบายตัวอย่างของ SQUID มีบทความมากเกินไปเกี่ยวกับเรื่องนี้บนอินเทอร์เน็ต คุณสามารถค้นหาได้ด้วยตัวเอง
การโพล DNS:
BIND เป็นซอฟต์แวร์เซิร์ฟเวอร์ DNS แบบโอเพ่นซอร์ส นี่เป็นเรื่องใหญ่ที่ต้องพูดถึง เพียงค้นหาด้วยตัวเองแล้วทุกคนก็รู้ว่ามีอยู่จริง
ฉันรู้ว่าเว็บไซต์ขนาดใหญ่บางแห่งเช่น chinacache ทำเช่นนี้ มันเป็นหลายเซิร์ฟเวอร์ หน้าหรือไฟล์เดียวกันถูกแคชไว้บนเซิร์ฟเวอร์ที่แตกต่างกันและแยกวิเคราะห์ไปยังเซิร์ฟเวอร์ที่เกี่ยวข้องโดยอัตโนมัติตามทิศเหนือและทิศใต้