Sempre que construímos grandes sistemas, o desempenho é um dos maiores vilões. As performances geralmente podem corresponder ao balanceamento de carga dos servidores, o tempo de resposta das páginas que construímos, e assim por diante! Quando trabalhamos na plataforma force.com, a maior parte desse trabalho pesado é cuidada pela própria plataforma, para o nosso alivio. No entanto, há certas coisas que podemos ajustar para melhorar ainda mais o desempenho, e um desses conceitos é o uso do Platform Cache.
O que é um cache?
tenha sempre em mente que Cache é um armazenamento temporário
Primeira mente, tenha sempre em mente que Cache é um armazenamento temporário, e de uma forma geral é frequentemente usado para evitar acesso desnecessários em um banco de dados, vamos uma imaginar um cenário de uso, onde você armazena no seu banco de dados a Endpoint e Token para acessar um aplicação externa, se você imaginar uma página com muitos acessos e que a cada acesso é realizado uma chamada para uma aplicação externa, a cada acesso precisaríamos consultar os dados de acesso no banco de dados, o que consumiria muito recurso e tempo da plataforma, agora imagine ter essa informação sempre em memória e disponível para uso imediatamente sem depender de uma consulta a banco de dados, não seria ótimo? Pois então, isso é o cache.
O que é um Platform Cache?
Os aplicativos podem acessar esses dados rapidamente, sem precisar realizar novas consultas ao banco de dados
O Platform Cache é uma camada de memória que armazena a sessão do Salesforce e os dados da organização para acesso posterior. Lembra do que eu falei do que era o Cache, então o Platform Cache, é exatamente isso, um espaço de armazenam de dados reutilizáveis na memória, podendo esse estar segmentado por usuário ou por organização. Os aplicativos podem acessar esses dados rapidamente, sem precisar realizar novas consultas ao banco de dados para obter informações, tornando o acessa a informação muito mais rápido, dentro da plataforma Salesforce, você poderá gravar e acessar esses dados de uma partição.
O que são partições do Platform Cache?
Partições permitem alocar espaço em cache para equilibrar o uso e o desempenho entre aplicativos. Armazenar dados em cache para partições designadas faz com que o espaço em cache não seja substituído por outros aplicativos ou por dados menos importantes, uma vez que o espaço de armazenamento do cache é limitado, dessa forma cada um tem o seu espaço e ninguém mexe na caixa de ninguém.
tenha sempre em mente que as partições são espaços reservados e previamente definidos.
Antes de usar espaço em cache em sua organização, você precisará criar partições e definir a capacidade desejada para os aplicativos. A capacidade de cada partição é dividida entre cache da organização e cache da sessão. As alocações de cache da sessão e da organização podem ser zero, 5 MB ou mais e precisam ser números inteiros.
O tamanho mínimo de uma partição, incluindo suas alocações de cache da sessão e da organização, é 5 MB. Por exemplo, digamos que sua organização tem um total de 10 MB de espaço em cache e você criou uma partição com um total de 5 MB, dos quais 5 MB são para o cache da sessão e 0 MB para o cache da organização. Ou você criou uma partição de 10 MB de espaço, com 5 MB para o cache da organização e 5 MB para o cache da sessão. A soma de todas as partições, incluindo a partição padrão, é igual à alocação total do cache da plataforma.
Então tenha sempre em mente que as partições são espaços reservados e previamente definidos.
Quando posso usar o Platform Cache?
Você pode usar o Platform Cache em seu código praticamente em qualquer lugar em que os dados são acessados repetidamente. O uso de dados em cache melhora o desempenho de seu aplicativo, e chega a ser pelo menos 2x mais rápido que consultas SOQL, em chamadas externas de APIs chega a ser mais de 10x mais rápido , fazer várias chamadas de API ou fazer cálculos complexos.
Os melhores dados para armazenamento em cache são:
- Os reutilizados em uma sessão ou reutilizados por vários usuários e solicitações
- Dados que sofrem poucas alterações e são recuperados do banco de dados com alta frequência
- Cálculos complexos ou recuperação cara
Que tipos de cache estão disponíveis na minha ORG?
Existem dois tipos de Platform Cache, o cache da organização e cache da sessão.
Cache da organização
O cache da organização armazena dados de toda a organização, que todos nela podem usar. O cache da organização pode ser acessado entre sessões, solicitações, usuários e perfis da organização.
Cache da sessão
O cache da sessão armazena dados específicos de determinado usuário e está vinculado a uma sessão do usuário. A validade máxima de uma sessão é de 8 horas.
Quanto de cache tenho disponível para na minha ORG?
Alguns limites são impostos no que tange o uso do Platform Cache em sua organização, e esses limites tem relação direta com o tipo da sua organização, lembrando que esses limites são os padrões e podem variar de acordo com o contrato existente com a Salesforce.
Tipo de Organização | Tamanho do Cache |
Enterprise | 10 MB |
Unlimited e Performance | 30 MB |
Outras | 0 MB |
Existem também os limites de sessão, são eles:
Descrição dos limites | Valores |
---|---|
Tamanho máximo de um único item em cache | 100 KB |
Tamanho máximo do cache local para uma partição, por solicitação | 500 KB |
Tempo de vida mínimo atribuído ao desenvolvedor | 300 segundos (5 minutos) |
Tempo de vida máximo atribuído ao desenvolvedor | 28,800 segundos (8 horas) |
Tempo de vida máximo do cache de sessão | 28,800 segundos (8 horas) |
E por fim os limites de cache da organização, são eles:
Descrição dos limites | Valores |
---|---|
Tamanho máximo de um único item em cache | 100 KB |
Tamanho máximo do cache local para uma partição, por solicitação | 1.000 KB |
Tempo de vida mínimo atribuído ao desenvolvedor | 300 segundos (5 minutos) |
Tempo de vida máximo atribuído ao desenvolvedor | 172.800 segundos (48 horas) |
Tempo de vida máximo do cache de sessão | 86.400 segundos (24 horas) |
Ativando o Platform Cache na sua Org
Para ativar o Platform Cache, você deve acessar o Setup.
Em seguida, procure no menu por Platform Cache.
Um vez aqui, você pode criar, editar, remover e verificar os limites de cada uma das suas partições, mas antes, pode ser necessário solicitar um Trial caso a sua ORG não tenha limite de cache disponível, que é o caso da minha Developer Edition, para isso basta clicarmos no botão [Request Trial Capacity].
No caso de uma ORG Developer Edition, o trial é valido por 6 meses e para outras ORGs são de 21 dias úteis.
Em seguida será exibido um Pop Up informando que você só poderá solicitar o trial 90 dias depois da última solicitação, clique em OK e aguarde.
O processo geralmente é automático e não deve levar mais do que poucos segundos, em seguida você deverá ver a sua tela do Platform Cache assim:
Clique no botão [New Platform Cache Partition] para criar as sua primeira partição, você deverá ver uma tela assim:
Você deve especificar um Label e um Nome, a flag indicando se ela é Default Partition te permite não especificar o Namespace para acessar a sua Partição, você poderá ter apenas uma Partição Default na sua ORG.
Em seguida você terá dois grupos principais de Cache, que já falamos anteriormente, são o Session Cache Allocation e ORG Cache Allocation, distribua os valores de acordo com sua necessidade, lembrando que os valores podem ser 0, 5 ou qualquer número maior que 5, desde que seja inteiro e respeite o limite total disponível, no nosso caso o máximo é 10, os valores aqui são em MB.
Lendo e Gravando valores no Cache via APEX
No nosso exemplo de leitura e gravação, vamos trabalhar com uma partição chamada Cotacao, e um cache do tipo cache de Organização, onde o valor é valido para todas as sessões, usuários e perfis. No cenário imaginado, a minha classe tem dois métodos o putCotacao e o getCotacao, onde utilizaremos o putCotacao para gravar o valor da cotação de uma determinada moeda no Cache, e o getCotacao, para receber o valor da cotação da moeda desejada, caso a cotação não existe no cache, será feita uma consulta no banco de dados para retornar o valor e também armazenar esse valor no Cache para consultas posteriores.
public class CotacaoCache { private Cache.OrgPartition part; public CotacaoCache() { part = Cache.Org.getPartition('local.Cotacao'); } public void putCotacao(String moeda, Decimal valorCotacao) { part.put(moeda, valorCotacao); } public Decimal getCotacao(String moeda) { Decimal cachedValue = (Decimal)part.get(moeda); if (cachedValue != null) { return cachedValue; } else { Decimal cotacao = [SELECT Cotacao FROM Moeda__C WHERE Name = :moeda].Cotacao; putCotacao(moeda, cotacao); return cotacao; } } }
É claro que o nossa classe poderia ter várias outras tratativas, mas a ideia aqui é somente exemplificar o uso do Platform Cache através do código Apex.
Caso estivéssemos utilizando o cache do tipo de sessão, faríamos então o uso de outra classe do Cache, a Cache.Session ao invés da Cache.Org:
// Obtém o Session Partition Cache.SessionPartition sessionPart = Cache.Session.getPartition('local.CurrencyCache'); // Adiciona um valor ao Cache sessionPart.put('FavoriteCurrency', 'JPY'); // Recupera o valor da sessão String cachedRate = (String)sessionPart.get('FavoriteCurrency');
Acessando dados do Cache direto de uma Visualforce Page
Podemos acessar tanto os dados da Sessão quanto da Org direto pela Visualforce Page, fazendo uso dos marcadores a seguir:
<apex:outputText value="{!$Cache.Org.local.Cotacao.USD}"/>
E para os dados de uma Sessão, basta trocar o ORG por Session, como no exemplo abaixo:
<apex:outputText value="{!$Cache.Session.local.CurrencyCache.FavoriteCurrency}"/>
Note então que temos que usar {!$Cache.[Session|Org].Namespace.Patição.Chave}
Boas práticas de uso do Platform Cache
Alguns pontos que deve ser sempre levado em consideração é o uso das boas práticas, separei aqui os pontos indicados na documentação do Platform Cache, são eles:
- Em geral, procure armazenar itens grandes no Cache, ao invés de vários pequenos
- Leve sempre em consideração os limites do seu Cache, para evitar despejos de dados
- Sempre faça métricas para comparar antes e depois da aplicação do Cache, mas considere utilizar o método System.currentTimeMillis() para calcular o tempo, ao invés de considerar o tempo do registro de depuração (Exemplo abaixo 1)
- Sempre faça o tratamento de falhas do Cache, para garantir que o dado retornado não seja nulo
- Quando possível, agrupe as solicitações de cache, mas esteja ciente dos limites de cache
- Esteja sempre ciente dos limites de cache da sua Organização
- Use a página de diagnósticos de cache com moderação (Ver imagem abaixo 2)
- Minimize as operações caras, armazenando os cálculos complexos em Cache
1 Uso do System.currentTimeMillis() para obter o tempo exato de processamento do seu código
long startTime = System.currentTimeMillis(); // Aplique seu código aqui [Antes e depois de aplicado o uso do Cache] long elapsedTime = System.currentTimeMillis() - startTime; System.debug(elapsedTime);
2 Acesse a tela de diagnostico através do menu Platform Cache, clique na partição desejada em seguida nos links indicados na imagem abaixo.
Recomendo ainda que você de uma olhada nesse módulo do Trailhead que trata especificamente do Platform Cache, e também de uma lida na documentação.
Conclusão
Já falei aqui sobre performance no post 9 técnicas para atingir alta performance em páginas visualforce e sem dúvida o uso da Platform Cache, se torna o 10º item dessa lista, pois dependendo do uso da sua aplicação, o cache pode trazer resultados realmente impressionantes, então sugiro que você de um pouco de atenção a este assunto, tenho certeza que você encontrará vários cenários de onde ele pode ser aplicado, aproveita que você chegou até aqui, e escreve nos comentários o que você achou desse tema? Você já conhecia o Platform Cache? Já fez uso dele?
Um forte abraço trailblazer e até o próximo post :)
Fernando Sousa
Senior Salesforce Developer
Bacharel em Sistemas da Informação pela Universidade de Taubaté (UNITAU) e MBA em Projeto de Aplicações para Dispositivos Móveis pelo IGTI – Instituto de Gestão em Tecnologia da Informação.
Comecei a programar bem cedo, por volta de 10 anos de idade, de maneira auto-didata passei por várias linguagens.
Em 2015 me conectei a plataforma Salesforce pela primeira vez, para fazer una integração entre um Aplicativos Mobile em android e o Salesforce Platform.
Atualmente com as certificações Salesforce Certified Platform Developer I, Salesforce Certified Platform App Builder, Salesforce Certified Platform Developer II, Salesforce Administrator e Sharing and Visibility.
Acompanhe meu Trailhead aqui.