1. O que é cache ASP/por que deveria ser armazenado em cache?
Quando seu site é construído usando a tecnologia ASP nos estágios iniciais, você pode sentir a conveniência trazida pela tecnologia de página web dinâmica ASP, bem como a liberdade de modificação e controle http gratuito. No entanto, à medida que o número de visitas aumenta, você certamente descobrirá que a velocidade de acesso ao seu site está ficando cada vez mais lenta e o IIS reinicia cada vez com mais frequência. Em seguida, você deve querer otimizar o asp, como substituir o banco de dados por melhor desempenho, criar índices, escrever procedimentos armazenados, etc. Algumas dessas medidas não exigem aumento de pressão de custos, enquanto outras exigem pressão de custos significativa (como clustering de acesso ao SQL), e o efeito não é necessariamente certo.
Diante da pressão do acesso à web, acho que a maneira mais econômica é usar a tecnologia de otimização de cache para aliviar a pressão do serviço da web.
O aumento do tráfego da web geralmente significa um rápido crescimento na demanda pelos seguintes recursos:
1. O aumento no tráfego da placa de rede requer mais CPU para processar o tráfego de rede e threads de E/S de rede.
2. A necessidade de abrir/fechar conexões de banco de dados com mais frequência (se a tecnologia de banco de dados for usada - geralmente o ASP usa bancos de dados como armazenamento de dados), o número de coisas que consomem recursos seriamente e os impasses causados por transações que competem por recursos aumentarão a I/ O Ou consumo de CPU.
3. Se a sessão for usada, o IIS consumirá mais memória para manter o estado, e o consumo de memória pode causar memória física insuficiente, causando trocas frequentes entre a memória física e a memória auxiliar, fazendo com que a execução do código seja pausada e a resposta da web seja bloqueada. .
4. Devido à falta de resposta oportuna ao acesso, causará falha no acesso à página web, fazendo com que os usuários atualizem, agravando assim a demanda por recursos como CPU e memória.
Na verdade, considerando aplicações web comuns, muitas vezes a execução dinâmica de código é desnecessária.
2. Classificação do cache asp
Para resumir sem autorização, o cache asp pode ser dividido em duas categorias:
1. Cache de arquivos
O chamado cache de arquivo é baseado no julgamento lógico de que a execução específica de um determinado ASP não mudará significativamente dentro de um período de tempo, então o conteúdo é armazenado na forma de HTML estático e, em seguida, a tecnologia de redirecionamento da web é usada para permitir que o cliente acesse os arquivos estáticos, para atender às necessidades de redução de CPU, recursos de banco de dados, etc. Existem muitos desses aplicativos. Por exemplo, muitos fóruns regeneram a postagem inteira em um arquivo estático ao responder a uma postagem e depois a redirecionam, como o fórum donews.com. Há também um efeito colateral (benefício) de ser estático – pode ser facilmente incluído por mecanismos de busca como o Google. Alguns dos chamados sistemas de divulgação de notícias adotaram esta tecnologia.
2. Cache de fragmentos de arquivo
O chamado cache de arquivo também é baseado no julgamento lógico. Uma determinada parte dos dados (geralmente obtidos por consulta de banco de dados de grande capacidade que requer recursos) não será alterada dentro de um determinado período de tempo, para que possamos armazenar esses dados no. forma de arquivos. Quando necessário, os dados podem ser obtidos lendo arquivos para evitar aumentar a carga no banco de dados. Por exemplo, geralmente armazenamos alguns dados no formato XML e depois usamos É assim que o fórum CSDN é tratado.
3. Cache de memória principal
Além disso, você também pode considerar o armazenamento em cache na memória, o armazenamento de conteúdo que requer resposta oportuna na memória e o transporte imediato do armazenamento rápido quando o acesso for necessário. Se um grande número de requisitos de acesso estiver concentrado em algumas páginas pequenas ou se a memória principal for grande o suficiente, acho que o uso do cache da memória principal pode definitivamente melhorar muito o desempenho do acesso à Web.
3. Como implementar/usar cache
As seguintes questões precisam ser consideradas ao implementar o cache:
1. Quais páginas não serão alteradas em um curto período de tempo?
Analise o seu próprio site, existem muitas páginas como esta. Por exemplo, um site geralmente possui colunas de notícias e informações. Essas colunas geralmente são postadas pelos mantenedores do site em um determinado horário do dia e as páginas raramente são alteradas depois disso. Então essas páginas são adequadas para cache de arquivos estáticos. Na verdade, é isso que o chamado sistema de comunicados à imprensa faz, então você também pode consultar as ideias desses sistemas para transformar suas páginas ASP dinâmicas originais.
2. Essas páginas são geradas utilizando a mesma lógica para todos os visitantes (ou seja, os visitantes não são diferenciados).
Além de colunas como notícias e informações onde todos os visitantes veem a mesma interface, aplicativos que consomem recursos, como fóruns, geralmente podem ser projetados para gerar uma lógica unificada (a mesma postagem será visualizada da mesma forma por três pessoas e por três pessoas). Essas páginas de aplicativos também podem ser alcançadas usando cache estático. Você também pode considerar a fragmentação dos dados e o uso de tecnologia de script para processá-los fora dos recursos de processamento do servidor, ou seja, do navegador do cliente.
3. Os custos e ganhos da utilização do cache.
O principal é espaço para o tempo (de resposta). Use a tecnologia de cache para pré-processar o conteúdo que será frequentemente necessário no futuro para melhorar a capacidade de resposta do servidor web e, mais importante, ganhar a preferência dos visitantes.
O preço é que a procura por espaço web aumenta e, ao mesmo tempo, o efeito do acesso pode ser afetado.
Mas acho que o cache adequado tem mais vantagens do que desvantagens.
4. Esses locais não são adequados para armazenamento em cache
Na página de consulta dinâmica, o conteúdo da consulta de cada pessoa é diferente, então os resultados de exibição são diferentes, então é improvável que os resultados da consulta sejam armazenados em cache, então o cache é mais complicado e a utilização do cache é baixa, resultando em altos custos de gerenciamento (assumindo que você armazene em cache 1.000 palavras-chave de consulta, então gerenciar a correspondência entre essas palavras-chave e o cache também é problemático).
4. Análise de exemplo
Suponha que o layout original de um fórum de sugestões seja o seguinte:
No diretório raiz:
Página inicial default.asp, geralmente destaques, recomendações, etc.
listBorad.asp Este arquivo lista os nomes e introduções de todas as colunas. Se possuir o parâmetro MainBID, significa que as colunas da seção devem ser listadas.
listThread.asp Se este arquivo não contém nenhum parâmetro, significa que todos os posts estão listados, e se contém MainBID, significa que todos os posts de um determinado bloco estão listados. Se o subBID for realizado, significa listar as postagens em colunas específicas. Se o parâmetro page for carregado, os tópicos serão listados em páginas.
ViewThread.asp lista o conteúdo de uma postagem. Presumimos que a postagem seja exibida como um comentário e todos os comentários serão listados no final. O parâmetro ID é o post a ser exibido.
Reply.asp responde a uma postagem e carrega o parâmetro Id para responder a uma postagem.
Os outros não serão discutidos por enquanto.
Pelo exposto, podemos ver que se tudo for feito usando ASP/PHP original, a execução de quase todos os arquivos asp exigirá operações de banco de dados, consultas frequentes e consultas multitabelas. Você deve saber que consultar o banco de dados acabará por levar a uma diminuição no desempenho e na velocidade de resposta, o que afetará a navegação lenta dos visitantes e não favorece a qualidade da web. O que é mais importante é que para duas pessoas, A e B, se acessarem ViewThread.asp e similares, se o ID for o mesmo, muitas vezes verão o mesmo conteúdo (o código HTML recebido por seus navegadores é quase o mesmo). mesmo), mas para isso, para o mesmo conteúdo, o servidor precisa abrir conexões de banco de dados, consultar, ler registros, exibir, fechar registros e conexões de banco de dados. . . . Se mais pessoas acessarem as seguintes operações que consomem recursos do servidor, o resultado final será que essas pessoas consumirão mais recursos do servidor. Na verdade, esses esforços repetidos para o mesmo conteúdo podem ser evitados com o uso da tecnologia de cache para otimização. por exemplo:
Depois de enviar o conteúdo em respond.asp, chamamos imediatamente a função estática e armazenamos todo o conteúdo da postagem como um arquivo html estático, como viewThread_xxxx.htm. Em circunstâncias normais, ao acessar viewThread.asp?ID=xxxx, o sistema redireciona automaticamente. ao arquivo estático correspondente viewThreadxxxx.htm. Desta forma, quando um post não tiver a versão mais recente, será sempre um conteúdo estático fornecido aos visualizadores; assim que houver um novo envio, ele será atualizado para o arquivo estático. Desta forma, muitas operações do banco de dados serão salvas; e a resposta será muito melhorada.
listBorad.asp também pode ser implementado estaticamente. Podemos analisar os parâmetros que ele pode carregar, definir o nome do arquivo de cache como listBoard_xx.htm e atualizar listBoard_xxx.htm ao adicionar novas colunas. listThread.asp é semelhante, exceto que, por ter mais parâmetros, haverá muitos arquivos de cache. Se você deseja armazenar em cache listThread.asp? subBID=xxx&page=2, o arquivo estático correspondente é listThread_xxx_p2.htm. O mesmo vale para default.asp.
Então, como saber quando atualizar? Quando será atualizado?
Discutindo listThread.asp? subBID=xxx&page=2, extraímos subID e página ao executar listThread.asp e, em seguida, detectamos se listThread_xxx_p2.htm existe, chamamos a função de geração estática para gerar o arquivo e, finalmente, redirecionamos. aqui arquivos estáticos. Observe que a ausência aqui significa que há novos conteúdos que precisam ser atualizados.
Então, como fazer com que o arquivo não exista? excluir. Quando publicamos uma nova postagem, excluímos uma postagem ou movemos uma postagem, podemos excluir todos os arquivos estáticos como listThread_xxx_p2.htm. Isso informa quando armazenar em cache.
Agora resta uma dúvida: como gerar arquivos estáticos?
Notamos a mesma coisa que mencionamos antes. Podemos fazer uma cópia de default.asp, listThread.asp, etc. antes da transformação, chamada default_d.asp, listThread_2.asp, e no mesmo diretório (teoricamente listThtrad.asp?s O resultado do acesso de ubID=123 e LISTtHREAD_D.ASP?SUBID=123 será o mesmo), então na lógica que precisa gerar arquivos estáticos, chamamos a cópia antes da transformação através de solicitação de acesso WEB, pegamos o código html e armazenamos isto Para arquivos estáticos. Essa solicitação da web é, na verdade, equivalente ao próprio servidor visualizar o HTML que será gerado antes que qualquer navegador real acesse o conteúdo estático e, em seguida, retorne esses códigos e os armazene como arquivos estáticos usando a função de operação de arquivo. Desta forma, o arquivo cache é criado antes do visualizador real.
Tal solução dificilmente afetará o layout original e quase nunca causará erros como 404 devido a modificações. Em segundo lugar, os arquivos estáticos também ajudarão seu site a ser facilmente indexado por mecanismos de pesquisa como o Google. Por que não?
Por fim, um lembrete, através do acesso web, no ambiente de programação ASP, muitas pessoas utilizam o componente xmlHTTP para acessar, o que causará muitos problemas. O próprio xmlhttp irá armazenar em cache os recursos solicitados, fazendo com que o conteúdo que solicitamos através deste componente não seja o mais recente, causando confusão lógica. Portanto, você deve escolher o objeto http do servidor xml ou o componente winhttp para implementar recursos de solicitação da web.
Usar a tecnologia de cache no ASP pode melhorar muito o desempenho do seu site. Na verdade, esses métodos de implementação são muito simples. Eles explicarão como funciona o cache no servidor e como você pode usar um método chamado tecnologia de conexão ADO.
Antes de apresentar essas tecnologias, vamos explicar o que é exatamente a tecnologia de cache ASP.
O chamado cache serve, na verdade, para abrir um espaço na memória para salvar dados. Ao usar o cache, você não precisa acessar com frequência os dados salvos no disco rígido. a angústia de ver o pobre disco rígido ficar cheio, sou torturado pela leitura de dados. Depois de executar uma consulta e colocar os resultados da consulta no cache, você poderá acessar rapidamente os dados repetidamente. E se você não colocar os dados no cache, ao executar a consulta novamente, o servidor gastará o processo obtendo e classificando-os no banco de dados.
Quando os dados são armazenados no cache, o tempo gasto na consulta novamente é principalmente o tempo para exibir os dados.
Em outras palavras, não devemos colocar dados que precisam ser alterados com frequência no cache do servidor. Devemos colocar dados que mudam menos, mas que precisam ser acessados com frequência no cache.
Agora discutiremos como o ASP usa a tecnologia de cache no lado do servidor e, em seguida, discutiremos como o ASP a usa no lado do cliente.
Tecnologia de cache.
Quando você tem uma grande quantidade de dados (estáticos, ou seja, com menos alterações) que precisam ser exibidos ao cliente, você pode considerar o uso da tecnologia de cache do lado do servidor. Essa tecnologia é especialmente adequada para sites com forte consistência de estilo de exibição (haha, não é fácil de usar para sites não convencionais).
Na verdade, o método de implementação é muito simples. Basta olhar o exemplo simples abaixo para entender.
Este é um exemplo de programa para exibir categorias de livros
Arquivo DisplayBooks.ASP:
< %@ LANGUAGE=JavaScript % >
<html>
<corpo>
<método de formulário = postagem>
Classificação do livro;
<p>
< tipo de entrada = enviar >
<%
função getBooksListBox()
{
BookListBox = Aplicativo(BookListBox)
if (BooksListBox! = null) return BooksListBox;
crlf = String.fromCharCode(13, 10)
BooksListBox = <selecione nome=Livros> + crlf;
SQL = Selecione * FROM Livros orDER BY Nome;
cnnBooks = Server.CreateObject(ADODB.Connection);
cnnBooks.Open(Livros, Admin,);
primeirosLivros = cnnBooks.Execute(SQL);
fldNomeLivro = primeirosLivros(NomeLivro);
enquanto (!rstLivros.EOF){
BookListBox = BookListBox + <opção> +
fldNomeDoLivro + + crlf;
primeirosLivros.MoveNext();
}
ListaLivros = CaixaListLivros +
Aplicativo(LivrosListBox) = LivrosListBox
return BookListBox;
}
%>
É muito simples. Na verdade, usa tecnologia de aplicação muito simples e a diferença é apenas uma frase:
Aplicativo(LivrosListBox) = LivrosListBox
Você pode verificar e descobrirá que o número de solicitações no servidor será bastante reduzido. Esta situação é especialmente adequada para o conteúdo do site que não é atualizado com muita frequência, por exemplo, você só o atualiza uma vez por dia (ou por muito tempo).
A seguir, discutiremos uma tecnologia de cache do lado do cliente. Essa tecnologia também é chamada de tecnologia de conexão ADO desconectada (o nível de tradução é muito baixo, por que parece tão estranho). Esta tecnologia é usada principalmente para salvar informações pessoais dos usuários, como senhas de usuários, codinomes, etc. Ele usa principalmente algumas propriedades do ADO. Ao mesmo tempo, também responde à questão de saber se os objetos ADO podem ser usados no Applocation, mencionada por alguns internautas. A explicação não está clara, deixe o código falar:
Arquivo GLOBAL.ASA:
< !--METADATA TYPE=TypeLib FILE=C:/Arquivos de programas/Common
Arquivos/sistema/ado/msado15.dll-->
< SCRIPT LANGUAGE=VBScript RUNAT=Servidor >
Subaplicativo_OnStart
SQL = Selecione nome de usuário, senha de UserInfo
cnnUsers = DSN=Usuário
Definir rsUsers = Server.CreateObject(ADODB.Recordset)
'Observe que as duas frases a seguir são usadas para implementar a tecnologia ADO chamada desconexão disponível.
rsCustomers.CursorLocation = adUseClient
rsCustomers.Open SQL, cnnAdvWorks, adOpenStatic, AdLockReadOnly
'Desconecta o RecordSet do banco de dados
rsCustomers.ActiveConnection = Nada
Definir Aplicativo(rsCustomers) = rsCustomers
Finalizar sub
ArquivoUsers.ASP
<%
'O método clone permite que cada usuário tenha sua própria coleção RecordSet
Defina seus usuários = aplicativo (rsUsers).Clone
Definir nome de usuário = seus usuários (nome de usuário)
Definir senha = seus usuários (senha)
Faça até yourUsers.EOF
%>
Nome de usuário: < %= Nome de usuário % > Senha de usuário: < %= Senha % >
<%
seus usuários.MoveNext
Laço
%>
Quanto ao papel do cache, acho que não preciso dizer mais nada. Seu papel já é óbvio, principalmente para sites com grande quantidade de informações ou páginas de banco de dados completas. Ele pode aproveitar bem os recursos de memória do host. acelerar a eficiência de execução do ASP, reduzindo a carga no servidor. Dongwang é o que mais se destaca neste aspecto. Por exemplo, sua versão atual dvbbs7.1.0 elevou a utilização do cache a um nível superior. A maioria das operações na frente e atrás estão relacionadas ao cache, e agora o que é usado em Dongwang é o. classe de cache do Filho Pródigo de Lost City:
<%
Classe Cls_Cache
'==================Instruções de uso====================
'Este módulo é uma criação original de Dongwang Pioneer, autor: Lost City Prodigal. Se você usar este tipo de módulo, não remova esta descrição. Este comentário não afeta a velocidade de execução.
'Função: Cache e classe de gerenciamento de cache
'Variável pública: tempo de expiração do tempo de recarga (em minutos), o valor padrão é 14400
'MaxCount é o valor máximo de objetos em cache. Se exceder, os objetos com menos uso serão excluídos automaticamente. O valor padrão é 300
'CacheName é o nome total do grupo de cache. O valor padrão é Dvbbs. Se houver mais de um grupo de cache em um site, esse valor precisará ser alterado externamente.
'Attribute:Name define o nome do objeto de cache, atributo somente gravação.
'Atributo:valor Ler e gravar dados de cache.
'Função: ObjIsEmpty() determina se o cache atual expirou.
'Método: DelCahe(MyCacheName) exclui manualmente um objeto de cache, o parâmetro é o nome do objeto de cache.
'========================
Tempo de recarga público,MaxCount,CacheName
LocalCacheName privado,CacheData,DelCount
Subclasse Privada_Initialize()
Reloadtime=14400 'Tempo de expiração (unidade: minutos)
CacheName=Dvbbs 'Nome total do grupo de cache
Finalizar sub
SubSetCache privado (SetName,NewValue)
Aplicativo.Lock
Aplicativo(SetName) = NovoValor
Aplicativo.unLock
Finalizar sub
Propriedade pública Let Name(ByVal vNewValue) 'Nome do objeto de cache
LocalCacheName=LCase(vNewValue)
Propriedade final
Propriedade pública Let Value(ByVal vNewValue) 'Ler e gravar dados de cache
Se LocalCacheName<> Então
CacheData=Aplicativo(CacheName&_&LocalCacheName)
Se IsArray(CacheData) então
CacheData(0)=vNovoValor
CacheData(1)=Agora()
Outro
ReDim CacheData(2)
CacheData(0)=vNovoValor
CacheData(1)=Agora()
Terminar se
SetCache CacheName&_&LocalCacheName,CacheData
Outro
Err.Raise vbObjectError + 1, DvbbsCacheServer, altere o CacheName.
Terminar se
Propriedade final
Propriedade Pública Obter Valor()
Se LocalCacheName<> Então
CacheData=Aplicativo(CacheName&_&LocalCacheName)
Se IsArray(CacheData) então
Valor=CacheData(0)
Outro
Err.Raise vbObjectError + 1, DvbbsCacheServer, o CacheData está vazio.
Terminar se
Outro
Err.Raise vbObjectError + 1, DvbbsCacheServer, altere o CacheName.
Terminar se
Propriedade final
Função Pública ObjIsEmpty() 'Determina se o cache atual expirou
ObjIsEmpty = Verdadeiro
CacheData=Aplicativo(CacheName&_&LocalCacheName)
Se não for IsArray (CacheData), então saia da função
Se não for IsDate(CacheData(1)) então saia da função
Se DateDiff(s,CDate(CacheData(1)),Now()) < 60*Reloadtime Then ObjIsEmpty=False
Função final
Private Sub makeEmpty(SetName) 'Libera memória
Aplicativo.Lock
Aplicativo(SetName) = Vazio
Aplicativo.unLock
Finalizar sub
Public Sub DelCache(MyCacheName) 'Excluir cache
makeEmpty(CacheName&_&MyCacheName)
Finalizar sub
Fim da aula
'Definir WydCache=Novo Cls_Cache
'WydCache.Reloadtime=0.5 'Defina o tempo de expiração (em minutos)
'WydCache.CacheName=pages 'Definir nome do cache
'IF WydCache.ObjIsEmpty() Then ''Determine se está disponível (incluindo expiração e se está vazio)
'Resposta.write WydCache.Value
'Outro
'..........
'BoardJumpList=xxx
'WydCache.Value=BoardJumpList 'Escrever conteúdo
'Resposta.write BoardJumpList
'Terminar se
'
'mycache.DelCache(nome do cache) excluir cache
%>