Technologie de mise en cache universelle
Cache de données : le cache de données mentionné ici fait référence au cache de requêtes de base de données. Chaque fois qu'une page est accédée, il détectera d'abord si les données mises en cache correspondantes existent, si elles n'existent pas, se connecteront à la base de données, obtiendront les données et les sérialiseront. les résultats de la requête enregistrez-le dans un fichier, et les mêmes résultats de requête seront obtenus directement à partir de la table ou du fichier de cache à l'avenir.
L'exemple le plus largement utilisé est la fonction de recherche de Discuz, qui met en cache l'ID du résultat dans une table et recherche d'abord la table de cache lors de la recherche suivante du même mot-clé.
En tant que méthode courante, lorsque plusieurs tables sont associées, le contenu de la table attachée est généré dans un tableau et enregistré dans un champ de la table principale. Si nécessaire, le tableau est décomposé. L'avantage est qu'une seule table peut être décomposée. être lu, mais l'inconvénient est que la synchronisation de deux données prendra beaucoup plus d'étapes, et la base de données est toujours le goulot d'étranglement. L'échange du disque dur contre la vitesse est le point clé à cet égard.
Cache des pages :
Chaque fois qu'une page est accédée, il détectera d'abord si le fichier de page mis en cache correspondant existe. S'il n'existe pas, il se connectera à la base de données, récupérera les données, affichera la page et générera un fichier de page mis en cache en même temps. afin que le fichier d'échange entre en jeu lors de votre prochaine visite. (Les moteurs de modèles et certaines classes de cache courantes sur Internet ont généralement cette fonction)
Cache déclenché par l'heure :
Vérifiez si le fichier existe et si l'horodatage est inférieur au délai d'expiration défini. Si l'horodatage de modification du fichier est supérieur à l'horodatage actuel moins l'horodatage d'expiration, utilisez le cache, sinon mettez à jour le cache.
Le contenu déclenche la mise en cache :
Forcer la mise à jour du cache lorsque des données sont insérées ou mises à jour.
Cache statique :
Le cache statique mentionné ici fait référence à des fichiers texte statiques, générant directement des fichiers texte tels que HTML ou XML, et les régénérant lorsqu'il y a des mises à jour. Il convient aux pages qui ne changent pas beaucoup, je n'en parlerai donc pas ici.
Le contenu ci-dessus est une solution au niveau du code. Je CP directement d'autres frameworks et je suis trop paresseux pour changer. Le contenu est presque le même et peut être utilisé de plusieurs manières. -solution de mise en cache côté, pas au niveau du code, elle nécessite la coopération de plusieurs parties pour y parvenir.
Mémoire cache :
Memcached est un système de mise en cache d'objets à mémoire distribuée hautes performances utilisé pour réduire la charge de la base de données et améliorer la vitesse d'accès dans les applications dynamiques.
Voici un exemple de Memcached :
<?php
$memcache = nouveau Memcache ;
$memcache->connect('localhost', 11211) ou die ("Impossible de se connecter");
$version = $memcache->getVersion();
echo "Version du serveur : ".$version."n" ;
$tmp_object = nouvelle classe std ;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123 ;
$memcache->set('key', $tmp_object, false, 10) ou die (« Échec de la sauvegarde des données sur le serveur »);
echo "Stocker les données dans le cache (les données expireront dans 10 secondes)n" ;
$get_result = $memcache->get('clé');
echo « Données du cache :n » ;
var_dump($get_result);
?>
Exemple de lecture de la bibliothèque :
<?php
$sql = 'SELECT * FROM utilisateurs';
$key = md5($sql); //identifiant d'objet memcached
if ( !($datas = $mc->get($key)) ) {
// Si les données mises en cache ne sont pas obtenues dans memcached, utilisez la requête de base de données pour obtenir le jeu d'enregistrements.
echo "n".str_pad('Lire les données depuis MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
tandis que ($row = mysql_fetch_object($result))
$données[] = $ligne ;
//Enregistrez les données de l'ensemble de résultats obtenues à partir de la base de données dans Memcached pour les utiliser lors du prochain accès.
$mc->add($key, $datas);
} autre {
echo "n".str_pad('Lire les données de memcached.', 60, '_')."n";
}
var_dump($données);
?>
tampon php :
Il existe eaccelerator, apc, phpa et xcache. Je n'en parlerai pas et voyez par vous-même.
Cache MYSQL :
Ceci est également considéré comme un niveau non-code. Les bases de données classiques utilisent cette méthode. Regardez le temps d'exécution ci-dessous. Je publierai une section comme 0.09xxx basée sur la partie modifiée de my.ini basée sur une table MYISAM 2G. être utilisé vers 0,05S, on dit qu'il l'a changé pendant près d'un an.
[client]
…
jeu de caractères par défaut = gbk
moteur de stockage par défaut = MYISAM
max_connections=600
max_connect_errors=500
back_log=200
interactif_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
Mise en cache Web basée sur un proxy inverse :
Tels que Nginx, SQUID, mod_proxy (apache2 et supérieur sont divisés en mod_proxy et mod_cache)
Exemple NGINX
<nginx.conf>
#utilisateur personne ;
travailleur_processus 4 ;
journaux error_log/error.log crit ;
journaux pid/nginx.pid ;
travailleur_rlimit_nofile 10240 ;
événements {
utilisez epoll ;
connexions_travailleur 51200 ;
}
http{
inclure mime.types ;
application de type_par défaut/flux d'octets ;
envoyer le fichier sur ;
keepalive_timeout 65 ;
tcp_nodelay activé ;
# pool de serveurs
bspfrontsvr en amont {
serveur 10.10.10.224:80 poids=1 ;
serveur 10.10.10.221:80 poids=1 ;
}
bspimgsvr en amont {
serveur 10.10.10.201 : 80 poids = 1 ;
}
bspstylesvr en amont {
serveur 10.10.10.202 : 80 poids = 1 ;
}
bsphelpsvr en amont {
serveur 10.10.10.204:80 poids=1 ;
}
bspwsisvr en amont {
serveur 10.10.10.203 : 80 poids = 1 ;
}
bspadminsvr en amont {
serveur 10.10.10.222:80 poids=1 ;
}
bspbuyersvr en amont {
serveur 10.10.10.223:80 poids=1 ;
}
bspsellersvr en amont {
serveur 10.10.10.225:80 poids=1 ;
}
bsploginsvr en amont {
serveur 10.10.10.220 : 443 poids = 1 ;
}
bspreregistrersvr en amont {
serveur 10.10.10.220:80 poids=1 ;
}
log_format test_com '$remote_addr – $remote_user [$time_local] « $request » '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" ';
#——————————————————————–
#img.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur img.test.com ;
emplacement/{
proxy_pass http://bspimgsvr ;
inclure proxy_setting.conf ;
}
access_log logs/img.log test_com ;
}
#style.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur style.test.com ;
emplacement/{
proxy_pass http://bspstylesvr ;
inclure proxy_setting.conf ;
}
access_log logs/style.log test_com ;
}
#aide.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur help.test.com ;
emplacement/{
proxy_pass http://bsphelpsvr ;
inclure proxy_setting.conf ;
}
access_log logs/help.log test_com ;
}
#admin.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur admin.test.com ;
emplacement/{
proxy_pass http://bspadminsvr ;
inclure proxy_setting.conf ;
}
access_log logs/admin.log test_com ;
}
#acheteur.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur acheteur.test.com ;
emplacement/{
proxy_pass http://bspbuyersvr ;
inclure proxy_setting.conf ;
}
access_log logs/buyer.log test_com ;
}
#vendeur.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur vendeur.test.com ;
emplacement/{
proxy_pass http://bspsellersvr ;
inclure proxy_setting.conf ;
}
access_log logs/seller.log test_com ;
}
#wsi.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur wsi.test.com ;
emplacement/{
proxy_pass http://bspwsisvr ;
inclure proxy_setting.conf ;
}
access_log logs/wsi.log test_com ;
}
#www.test.com
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur www.test.com *.test.com ;
emplacement ~ ^/NginxStatus/ {
stub_status activé ;
access_log off ;
}
emplacement/{
proxy_pass http://bspfrontsvr ;
inclure proxy_setting.conf ;
}
access_log journaux/www.log test_com ;
page_erreur 500 502 503 504 /50x.html ;
emplacement = /50x.html {
racinehtml;
}
}
#login.test.com
serveur {
écoutez 10.10.10.230:443 ;
nom_serveur login.test.com ;
SSL activé ;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5 min ;
ssl_protocols SSLv2 SSLv3 TLSv1 ;
ssl_ciphers TOUS :!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers activé ;
emplacement/{
proxy_pass https://bsploginsvr ;
inclure proxy_setting.conf ;
}
access_log logs/login.log test_com ;
}
#login.test.com pour vous inscrire
serveur {
écoutez 10.10.10.230:80 ;
nom_serveur login.test.com ;
emplacement/{
proxy_pass http://bspreregistrersvr ;
inclure proxy_setting.conf ;
}
access_log logs/register.log test_com ;
}
}
<conf/proxy_setting.conf>
proxy_redirect désactivé ;
proxy_set_header Hôte $host ;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10 m ;
client_body_buffer_size 128 ko ;
proxy_connect_timeout 90 ;
proxy_send_timeout 90 ;
proxy_read_timeout 90 ;
proxy_buffer_size 4k ;
proxy_buffers 4 32k ;
proxy_busy_buffers_size 64k ;
proxy_temp_file_write_size 64 Ko ;
Exemple de mod_proxy :
<Hôte Virtuel *>
Nom du serveur www.zxsv.com
Administrateur du serveur [email protected]
# paramètre de proxy inverse
ProxyPass / http://www.zxsv.com:8080/
ProxyPassReverse/ http://www.zxsv.com:8080 /
# racine du répertoire cache
CacheRoot «/var/www/proxy»
# stockage de cache maximum
Taille du cache 5 000 000
# heure : toutes les 4 heures
CacheGcIntervalle 4
# heure d'expiration maximale de la page : heure
CacheMaxExpire 240
# Heure d'expiration = (maintenant – last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# balise d'expiration par défaut : heure
CacheDefaultExpire 1
# forcer l'achèvement après la récupération du pourcentage de contenu : 60 à 90 %
CacheForceCompletion80
CustomLog /usr/local/apache/logs/dev_access_log combiné
</HôteVirtuel>
Je n'expliquerai pas l'exemple de SQUID. Il y a trop d'articles à ce sujet sur Internet. Vous pouvez le rechercher vous-même.
Sondage DNS :
BIND est un logiciel de serveur DNS open source. C'est un gros problème à mentionner. Recherchez-le vous-même et tout le monde sait qu'il existe.
Je sais que certains grands sites Web tels que chinacache le font. Pour faire simple, il s'agit de plusieurs serveurs. La même page ou le même fichier est mis en cache sur différents serveurs et automatiquement analysé sur le serveur concerné en fonction du nord et du sud.