Tecnologia de cache universal
Cache de dados: O cache de dados mencionado aqui refere-se ao cache de consulta do banco de dados. Cada vez que uma página é acessada, ele primeiro detecta se os dados armazenados em cache correspondentes existem, conecta-se ao banco de dados, obtém os dados e serializa. os resultados da consulta. Salve-os em um arquivo e os mesmos resultados da consulta serão obtidos diretamente da tabela ou arquivo de cache no futuro.
O exemplo mais amplamente usado é a função de pesquisa do Discuz, que armazena em cache o ID do resultado em uma tabela e pesquisa primeiro a tabela de cache na próxima vez que pesquisar pela mesma palavra-chave.
Como método comum, quando várias tabelas estão associadas, o conteúdo da tabela anexada é gerado em um array e salvo em um campo da tabela principal. Quando necessário, o array é decomposto. ser lido, mas a desvantagem é que a sincronização de dois dados exigirá muito mais etapas, e o banco de dados é sempre o gargalo. Trocar o disco rígido por velocidade é o ponto chave nisso.
Cache de página:
Cada vez que uma página é acessada, ele primeiro detecta se o arquivo de página em cache correspondente existe. Se não existir, ele se conectará ao banco de dados, obterá os dados, exibirá a página e gerará um arquivo de página em cache ao mesmo tempo. para que o arquivo da paginação seja reproduzido na próxima vez que você visitar. (Mecanismos de modelo e algumas classes de cache comuns na Internet geralmente possuem essa função)
Cache acionado por tempo:
Verifique se o arquivo existe e o carimbo de data/hora é menor que o tempo de expiração definido. Se o carimbo de data/hora de modificação do arquivo for maior que o carimbo de data/hora atual menos o carimbo de data/hora de expiração, use o cache, caso contrário, atualize o cache.
O conteúdo aciona o cache:
Força a atualização do cache quando os dados são inseridos ou atualizados.
Cache estático:
O cache estático mencionado aqui refere-se a arquivos de texto estáticos, gerando diretamente como HTML ou XML, e regenerando-os quando há atualizações. É adequado para páginas que não mudam muito, por isso não falarei sobre isso aqui.
O conteúdo acima é uma solução em nível de código. Eu copio diretamente outras estruturas e tenho preguiça de mudar. O conteúdo é quase o mesmo e pode ser usado de várias maneiras. solução de cache lateral, não no nível do código, requer a cooperação de várias partes para alcançá-la.
Cache de memória:
Memcached é um sistema de cache de objetos de memória distribuída de alto desempenho usado para reduzir a carga do banco de dados e melhorar a velocidade de acesso em aplicativos dinâmicos.
Aqui está um exemplo de Memcached:
<?php
$memcache = novo Memcache;
$memcache->connect('localhost', 11211) ou die ("Não foi possível conectar");
$versão = $memcache->getVersion();
echo “Versão do servidor: “.$version.”n”;
$tmp_object = nova stdClass;
$tmp_object->str_attr = 'teste';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) ou die (“Falha ao salvar dados no servidor”);
echo “Armazenar dados no cache (os dados expirarão em 10 segundos)n”;
$get_result = $memcache->get('chave');
echo “Dados do cache:n”;
var_dump($get_resultado);
?>
Exemplo de leitura da biblioteca:
<?php
$sql = 'SELECT * FROM usuários';
$key = md5($sql); //identificador do objeto memcached
if ( !($datas = $mc->get($key)) ) {
// Se os dados armazenados em cache não forem obtidos no memcached, use a consulta ao banco de dados para obter o conjunto de registros.
echo "n".str_pad('Ler dados do MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'teste', 'teste');
mysql_select_db('teste');
$resultado = mysql_query($sql);
while ($linha = mysql_fetch_object($resultado))
$dados[] = $linha;
//Salva os dados do conjunto de resultados obtidos do banco de dados no memcached para uso durante o próximo acesso.
$mc->add($chave, $dados);
} outro {
echo "n".str_pad('Ler dados do memcached.', 60, '_')."n";
}
var_dump($dados);
?>
buffer php:
Existem eaccelerator, apc, phpa e xcache. Não vou falar sobre eles.
Cache MySQL:
Isso também é considerado nível não-código. Os bancos de dados clássicos usam este método. Veja o tempo de execução abaixo. Vou postar uma seção como 0.09xxx com base na parte modificada do my.ini com base na tabela MYISAM 2G. ser usado. Por volta de 0,05S, diz-se que ele mudou por quase um ano.
[cliente]
…
conjunto de caracteres padrão = gbk
mecanismo de armazenamento padrão = MYISAM
max_connections=600
max_connect_errors=500
back_log=200
interact_timeout=7200
query_cache_size = 64 milhões
…
cache_tabela=512
…
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
meuisam_sort_buffer_size=128M
key_buffer_size=1024 milhões
read_buffer_size = 512 milhões
…
thread_concurrency=8
Cache da web baseado em proxy reverso:
Como Nginx, SQUID, mod_proxy (apache2 e superior são divididos em mod_proxy e mod_cache)
Exemplo NGINX
<nginx.conf>
#usuário ninguém;
processos_trabalhadores 4;
error_log logs/error.log crítico;
registros pid/nginx.pid;
trabalhador_rlimit_nofile 10240;
eventos {
usar epoll;
conexões_de_trabalhador 51200;
}
http{
inclua mime.types;
aplicação default_type/octeto-stream;
enviar arquivo ativado;
keepalive_timeout 65;
tcp_nodelay ativado;
# conjunto de servidores
upstream bspfrontsvr {
servidor 10.10.10.224:80 peso=1;
servidor 10.10.10.221:80 peso=1;
}
upstream bspimgsvr {
servidor 10.10.10.201:80 peso=1;
}
upstream bspstylesvr {
servidor 10.10.10.202:80 peso=1;
}
upstream bsphelpsvr {
servidor 10.10.10.204:80 peso=1;
}
upstream bspwsisvr {
servidor 10.10.10.203:80 peso=1;
}
upstream bspadminsvr {
servidor 10.10.10.222:80 peso=1;
}
upstream bspbuyersvr {
servidor 10.10.10.223:80 peso=1;
}
upstream bspsellersvr {
servidor 10.10.10.225:80 peso=1;
}
upstream bsploginsvr {
servidor 10.10.10.220:443 peso=1;
}
upstream bspregistersvr {
servidor 10.10.10.220:80 peso=1;
}
log_format test_com '$remote_addr – $remote_user [$time_local] “$request” '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" ';
#————————————————————————————————————————————————
#img.test.com
servidor {
ouça 10.10.10.230:80;
nome_do_servidor img.test.com;
localização/{
proxy_pass http://bspimgsvr ;
inclua proxy_setting.conf;
}
access_log logs/img.log test_com;
}
#style.test.com
servidor {
ouça 10.10.10.230:80;
nome_do_servidor style.test.com;
localização/{
proxy_pass http://bspstylesvr ;
inclua proxy_setting.conf;
}
access_log logs/style.log test_com;
}
#help.test.com
servidor {
ouça 10.10.10.230:80;
nome_servidor help.test.com;
localização/{
proxy_pass http://bsphelpsvr ;
inclua proxy_setting.conf;
}
access_log logs/help.log test_com;
}
#admin.test.com
servidor {
ouça 10.10.10.230:80;
nome_do_servidor admin.test.com;
localização/{
proxy_pass http://bspadminsvr ;
inclua proxy_setting.conf;
}
access_log logs/admin.log test_com;
}
#buyer.test.com
servidor {
ouça 10.10.10.230:80;
nome_do_servidorcomprador.test.com;
localização/{
proxy_pass http://bspbuyersvr ;
inclua proxy_setting.conf;
}
access_log logs/buyer.log test_com;
}
#vendedor.test.com
servidor {
ouça 10.10.10.230:80;
nome_servidor vendedor.test.com;
localização/{
proxy_pass http://bspsellersvr ;
inclua proxy_setting.conf;
}
access_log logs/seller.log test_com;
}
#wsi.test.com
servidor {
ouça 10.10.10.230:80;
nome_servidor wsi.test.com;
localização/{
proxy_pass http://bspwsisvr ;
inclua proxy_setting.conf;
}
access_log logs/wsi.log test_com;
}
#www.test.com
servidor {
ouça 10.10.10.230:80;
nome_do_servidor www.test.com *.test.com;
localização ~ ^/NginxStatus/ {
stub_status ativado;
access_log off;
}
localização/{
proxy_pass http://bspfrontsvr ;
inclua proxy_setting.conf;
}
access_log logs/www.log test_com;
página_de_erro 500 502 503 504 /50x.html;
localização = /50x.html {
roothtml;
}
}
#login.test.com
servidor {
ouça 10.10.10.230:443;
nome_servidor login.test.com;
SSL ativado;
ssl_certificate certificado.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers TODOS:!ADH:!EXPORT56:RC4+RSA:+ALTO:+MÉDIO:+BAIXO:+SSLv2:+EXP;
ssl_prefer_server_ciphers ativado;
localização/{
proxy_pass https://bsploginsvr ;
inclua proxy_setting.conf;
}
access_log logs/login.log test_com;
}
#login.test.com para registro
servidor {
ouça 10.10.10.230:80;
nome_servidor login.test.com;
localização/{
proxy_pass http://bspregistersvr ;
inclua proxy_setting.conf;
}
access_log logs/register.log test_com;
}
}
<conf/proxy_setting.conf>
proxy_redirect desativado;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
cliente_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;
proxy_buffers4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
Exemplo de mod_proxy:
<HostVirtual *>
Nome do servidor www.zxsv.com
ServerAdmin [email protected]
# configuração de proxy reverso
ProxyPass / http://www.zxsv.com:8080/
ProxyPassReverse/ http://www.zxsv.com:8080/
# cache do diretório raiz
CacheRoot “/var/www/proxy”
# armazenamento máximo em cache
Tamanho do cache 50000000
# hora: a cada 4 horas
CacheGcInterval 4
# tempo máximo de expiração da página: hora
CacheMaxExpirar 240
# Tempo de expiração = (agora – last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# etiqueta de expiração padrão: hora
CacheDefaultExpirar 1
# forçar conclusão após percentual de conteúdo recuperado: 60-90%
CacheForceCompletion80
CustomLog /usr/local/apache/logs/dev_access_log combinado
</VirtualHost>
Não vou explicar o exemplo do SQUID. Existem muitos artigos sobre isso na Internet.
Pesquisa de DNS:
BIND é um software de servidor DNS de código aberto. Basta pesquisar você mesmo e todos saberão que ele existe.
Eu sei que alguns sites grandes, como o chinacache, fazem isso. Simplificando, a mesma página ou arquivo é armazenado em cache em servidores diferentes e analisado automaticamente no servidor relevante de acordo com o norte e o sul.