continuando aqui estratégias De Cash como eu falei anteriormente uma delas é Cash distribuído né então Falar De Cash distribuído basicamente a própria palavra já indica a razão de existir né Ele é distribuído para vários servidores para várias aplicações e existem aí serviços produtos etc que fazem esse trabalho e fazem muito bem um dos mais conhecidos no merc aí obviamente é o redis e o redis ele é um serviço né De Cash também distribuído ele é utilizado para n coisas na verdade né em aplicações Eu já vi cenários onde salva ali sessão de usuário imagina no
Marketplace ali no e-commerce você precisa salvar o carrinho da sessão do usuário então tem n forma de utilizar o redis né já vi gente utilizando até como banco de dados ali mais ou menos não relacional para alguns cenários mas de novo depende bastante da aplicação do que você precisa fazer mas na Essência os serviços distribuídos eles são serviços externos Então você não tem uma dependência do Servidor web igual a gente viu anteriormente a outra prática do in Memory ele é salvo na memória do Servidor Então se o servidor cair se o servidor parar você vai
perder aquele Cash ali e ninguém vai acessar mais então aplicações críticas eh não conseguem trabalhar muito bem com esse cenário né imagine vários microsserviços consumindo ali o o Cash do servidor o servidor por algum motivo caiu você vai perder essas informações e vai ter possivelmente um Down time ali por questão de Cash já vi produtos serviços em produção terem parada significante porque o Cash parou lá seja em Memory ou distribuído né então é bem crítico tá é bem crítico esse esse de cash distribuído não é tão simples quanto parece mas normalmente para quem busca escalabilidade
performance É um cenário ideal porque aí você desacopla da sua aplicação esse Cash é mantido num servidor remoto normalmente usa-se servidores clouds né Microsoft aure usa cws Google etc mas dá para fazer de n formas e tem alguns benefícios de usar também o distribuído se você for comparar ali com o em Memory que é um Cash coerente entre múltiplos servidores então é um cache Centralizado para vários servidores Todo mundo vai ter a mesma informação de uma forma mais coerente como eu falei se Caiu o servidor ali que você tá usando a sua própria aplicação você
não afeta em nada porque o servidor não é o mesmo servidor de aplicação não usa Memória também local dos Servidores mas também tem alguns malefícios né Por exemplo você tem uma dependência de rede muito forte porque para sair da sua aplicação e para um servidor seja um servidor web que não é o mesmo servidor de aplicação você vai ter um um penal ali né um tempo de resposta um pouquinho mais demorado que você tem que considerar entre o o tráfego de rede da sua aplicação pro servidor que normalmente é um servidor fora então são n
cenários aí que você precisa considerar também pensando em performance aqui eu vou trazer algumas diretrizes de uso né que é o que a gente acabou de falar múltiplos servidores serviço desacoplado e idealmente também até por experiência prática o ideal é você ter um Cash para cada domínio de aplicação imagina um domínio de compra um domínio de venda um domínio enfim qualquer tipo de domínio Se você usar o mesmo servidor web ali o mesmo Cash para todo mundo você tem um ponto único de falha que é o que a gente chama de single point of failure
não é muito legal então na prática assim em projetos grandes Eu já vi terem diversos redis rodando ao mesmo tempo para domínios diferentes de aplicações e Seria algo meio similar a essa imagem né esse diagrama aqui onde o servidor ali um Web Browser alguém um cliente tá chamando os servidores Imagine que esse Web Server seja um Farm n servidores dentro do mesmo hardware ou não tá E aí orora chama o banco de dados hora chama serviço do redis e essa implementação a gente vai fazer aqui também agora para ficar um pouco mais tranquilo na cabeça
de vocês então vamos usar voltando aqui no nosso código nosso api como exemplo a gente vai no mesmo Controller e aqui eu vou criar um novo Controller aqui tá então basicamente um novo método Desculpa vou colocar um novo método aqui vou copiar esse get product aqui eu vou até tirar esse aqui porque como eu vou ter dois Gets não faz sentido né mas vou deixar esse código comentado aqui para vocês baixarem depois ao invés de ser Memory vou chamar de dist cche tá E aqui esse get products Vamos criar lá um from get product por
exemplo e vamos lá na nossa classe de serviço pra gente fazer essa implementação lá no product então aqui a gente tem que copiar essa esse método get products fromit aqui foi feit aqui vaiha aass entação do serviço tá aqui vamos fazer o seguinte antes de fazer isso eu tenho aqui uma classe de extensão que eu já tinha preparado como ela é meio extensa para pra nossa aula aqui não ficar tão extensa ainda vou copiar e colar do que eu já tinha preparado aqui então vou aded aqui um folder vou chamar de extensions extensions e vou
criar uma classe aqui chamada é distributed Cash extensions add Class distribute Cash extensions porque eu quero fazer uma extensão aqui basicamente do do Microsoft extension cche distributed que é uma dll da própria Microsoft Então vamos aproveitar já vamos colocar ela aqui no projeto Cadê manage NET packages já vamos procurar aqui essa extensão aqui ó Microsoft extension caching distributed essa primeira aqui é uma extensão própria tá Então cadê Aqui tá mostrando para mim só o abstractions Mas é por na realidade é outro namespace então aqui vai ser o Microsoft esse aqui de baixo Exchange redis tá
existe uma própria implementação também da própria Microsoft para lidar com esse cas do redis que é o que a gente vai usar Nossa aplicação Então vamos instalar ele aqui como package aceitar aqui os termos vai aqui no nosso serviço perfeito e aí Aqui é onde eu vou colocar esse código que eu já tinha preparado como eu falei ele é um pouquinho extenso então não faz sentido eu criar ele junto com vocês aqui mas a gente passa meio passo a passo nele aqui para vocês avaliarem o que que tá acontecendo Qual a ideia dele tá então
basicamente o que esse método de extensão tem né Essa essa classe Ele trabalha com as opções de serialização então pra parte de se eu vou ter ou não vou ter se eu vou ter alguma condição de escrita né porque aqui a gente tá lidando com Jason então é mais a parte de serialização essa primeira configuração aqui e esses métodos ó são os métodos essenciais aqui pra gente trabalhar então a gente tem um set a né a gente vai setar o cche E aí aqui onde eu tô setando ó importante ver onde eu tô setando aqui
os slid aspiration e Absolute aspiration tá qu a gente for implementar ali na classe de serviço eu explico um pouquinho mais mas aqui onde a gente define os nossos tempos né aqui é a classe de distribuição aqui é o tryg então igual a gente fez lá no em Memory a gente tem que ter o fallback e esse fallback eu tô fazendo aqui com esse método try get value Ele vai tentar pegar o valor que tá no cche né dando certo vai serializar isso e a gente vai trabalhar com Jason aqui E esse aqui é o
get or set ass então ou ele tenta pegar ou ele e já dá o set ao mesmo tempo tá então basicamente essa implementação que eu queria trazer E aí indo pra classe de serviço aqui ó vamos voltar na classe de serviço a gente vai fazer a implementação agora daquele método lá aqui implementação dessa interface e é a from redis ali e segue o mesmo conceito né a gente precisa ter aqui e o o cche né então vou colocar aqui um var cche Key que vai ser Ah não já tem ali em cima Ach que já
tava feito Beleza então eu vou ignorá-lo E aí vamos fazer o Cash options Cash options esse cara aqui vai ser as opções que a gente tinha lá de time span eu falei para vocês que eu ia falar um pouquinho melhor aqui então esse cara aqui eu vou fazer um Cash options New vou fazer o distributed cas entry options e aqui que eu vou começar a passar Ponto 7 Absolute expiration aqui eu vou passar um time span aqui que nem ele já tá me sugerindo tá aqui tá Seconds eu posso colocar from minutes vou colocar do
minutos aqui e set sliding expiration Vou colocar aqui 2 minutos basicamente isso então o o set Absolute aqui é realmente quanto tempo que vai levar para expirar esse cash de forma absoluta relativo ao tempo que ele começou então se começou 10 horas da manhã ele vai levar 2 minutos às 10:02 aqui é o tempo absoluto dele de vida e o sliding é quanto tempo que esse Cash né que essa entrada de Cash pode ficar inativa antes de ser removida então 2 minutos aqui de inspiração e eu tô colocando 2 minutos para ela ficar ainda inativa
lá no cach sem removê-la antes de precisar realmente fazer um dispose nesse Cash vamos falar assim e aí o products a gente vai usar essa mesma classe ali de baixo que é para pegar e os dados fakes aqui a gente não conectou em banco de dados ainda mas poderia aí ter um método aqui usando entity Framework ou alguma coisa similar aqui em cima eu tenho só o memory cach né então vou ter que fazer um Private read only só que aqui eu vou usar ó a interface i distribute distributed Cash tá que é o Cash
distribuído da própria Microsoft também então a própria Microsoft tem essas implementações De Cash distribuído e você pode usar tranquilamente vamos fazer aqui de novo o control ponto aqui para gerar um Construtor e fazer as injeções de dependência que a gente precisa tá legal e beleza aqui então o o product aqui vai ser a mesma ideia do que a gente fez ali tá a gente vai fazer produtos então aqui a gente vai usar aquela classe do Cash e Cash eu coloquei Cash ali em cima Ah que que eu coloquei ali Ah não foi ah foi distributed
Cash deixa eu colocar cash aqui fica fica melhor para lembrar fazer de novo aqui o cont control ponto virar de novo consutor Beleza agora Cash ali então Cash ali com aquela minha classe de extensão ó eu vou ter o método que eu preciso para retornar que é o get or 7 a esse carinha aqui eu tenho que passar o Cash ke que é a chave que tá com o nome de produtos ali em cima que esse nome é o que vai ser enviado lá pro redis né pra estrutura dele aqui eu vou chamar de forma
assíncrona aqui e de novo tá pessoal não estamos aqui se portando muito com boas práticas com possíveis e de c a c tá não vou entrar nesse mérito aqui então aqui return awa get values from the B A gente vai pegar do mesmo jeito que a gente pegou ali embaixo né e aqui eu vou passar o Cash options que eu criei ali em cima que é como vai se comportar esse meu cash de forma ativa e aqui vou retornar o return products tá deixa eu dar um build aqui só pra gente compreender se realmente momento
tá indo bem E aparentemente tá não é ter problema nenhum Ah lembrando né eu sempre esqueço do program.cs aqui a gente fazer as injeções então aqui Eu também preciso fazer a injeção eu eu eu fiz aqui do memory cche aqui eu preciso incluir ó builder.services.add stc Exchange Red cche que é o que a gente trouxe lá da Microsoft aí aqui eu tenho que passar algumas opções Vou colocar aqui options e nesse options eu vou abrir aqui tua chave e vou colocar aqui dentro assim ó options ponto configuration Esse configuration é onde a gente vai rodar
como meu redz eu vou subir um docker aqui então vou colocar no local host eu não tô passando porta porque a porta padrão do redis eu vou usá-la de forma que eu omito aqui então se eu colocar local host o a própria pack entende que a porta padrão ali que nós vamos ver já já é é a porta Ok então não precisa ficar passando porta aí aqui a mesma coisa options P configuration options eu preciso informar algumas outras coisas que eu acho legal até como dica para vocês aqui ó stack Exchange P redis.on configuration options
aqui tem dois parâmetros que eu acho interessante que é o abort on Connect fail eu gosto de deixar esse cara true por se tiver algum problema de conexão eu falei que a aplicação fica muito dependente da rede né então aqui eu tô na mesma rede tô local roost mas se fosse um servidor web externo no azure na aws por exemplo a gente pode ter algum problema de rede por algum motivo né E aí se eu coloco true ele já aborta aqui e eu meio que desconecto de uma forma mais suave para não causar muito problemas
e vou passar os end points aqui que eu vou falar para ele que os end points e são as mesmos que estão nessa minha opção de configuração Então é options configuration ele vai saber aqui que os end points é o que tá no configuration aqui que é loca host tá se eu tiver mais que mais que um end Point aí a gente teria que fazer de uma forma um pouquinho mais diferente tá Ah então aqui vamos ver se tá certo vamos seguir o fluxo vamos voltar lá na no meu Controller pegamos o Controller tá aqui
ele vai bater eu tirei esse aqui só porque senão vai ficar dois Gets tá mas aqui vai bater Vamos ver Aí ele vai cair aqui vai ser tá os cashes expiration aqui eu faço get or set a diferente do que eu fiz aqui em cima na implementação na mão né aqui eu fiz um try get value né eu fiz um if tal internamente esse cara aqui provavelmente faz a mesma coisa tá esse set Get your set né ele deve ter um if ali que ele verifica se existe ou não se existir ele pega se não
existir ele faz um set então um método só para fazer basicamente as duas coisas e o ideal seria também a gente invalidar o Cash quando a gente acrescenta um novo produto tá E aí isso é bem simples eu não vou reproduzir aqui mas seria algo tão simples como por exemplo assim Ah quer ver aqui se se fosse um método aqui aqui é um get mas se eu tivesse um post aqui era só eu fazer um Cash ponto remove e fazer o Cash que tá isso aqui ó vai remover o cche de lá vai invalidar o
cche na verdade porque imagina que eu tenho 10 produtos aí deixa eu até escrever aqui e invalidar o Cash de produtos quando um novo produto é inserido se eu tenho 10 produtos no cash aí eu adicionei um produto agora eu tenho 11 já no total na base mas no cash eu tenho 10 então no insert eu teria que invalidar se eu tivesse aqui um post no invés de um get eu faria a primeira ação era essa remove vai no banco faz o que tem que fazer e depois ca o Cash novamente tá então Cash remove
é a estratégia de tirar lá do Cash aqui como a gente só vai fazer um get para os mesmos produtos considerando que não teve inserção então não tem problema e eu acho que é isso a gente ah não a gente tem que subir o docker aqui então agora vamos subir o docker tá o docker local mesmo então se você for reproduzir lembre-se de ter o docker instalado aí eu usando docker for Windows que eu tô usando Windows aqui e aí aqui eu vou fazer esse comando ó docker container Run é na porta 6379 e vou
dar o nome de redis aqui então essa porta aqui eu não precisei passar lá no local host porque ela já é a porta padrão do redis tá então lá ele já pega por padrão Ah eu acho que eu já até tenho esse cara aqui se eu der um docker pass ele tá rodando ah ele tá falando que eu já tenho esse contêiner aqui então Eh como eu já tinha criado antes para testar ele tá com o mesmo nome eu dei um docker PS Men A apareceu aqui deixa eu ver se consigo fazer rmi Men F
Tirar essa imagem aqui docker images docker rmi menos F eu não tenho ninguém usando deveria remover isso daqui ah removeu beleza docker images não tenho mais aquele redis se isso acontecer com você é por causa disso a gente tá dando um nome pro redis E se eu quer der um Run de novo ele vai ver que já tem um cara chamado redis não vai deixar na teoria era para eu fazer um um start aqui daquela imagem né então aqui ele não achou porque eu acabei de excluir vai pegar de novo vai baixar Se eu der
um docker PS aqui ó eh ele ainda tá falando deixa eu arrumar isso aqui pra gente seguir a aula a solução aqui eu fiz um uma pausa rapidinho mas a solução foi essa mesmo realmente tá tentando dar um docker Run ele ia baixar de novo e ia criar uma nova imagem que o nome redis mas enfim aqui não é não tem problema aqui sempre conflito com o docker né que a gente fez foi o docker Run só que passando o nome do redis mesmo né então dá um docker Run e vai lá vamos dar um
docker PS só para garantir que tá funcionando beleza Tá de pé e aí tem aqui Um um software chamado e docker desktop Manager que é esse aqui que vocês podem baixar também e aqui eu já tinha essa conexão configurada então se eu tentar entrar aqui ó beleza já tá conectado mas para você fazer aí da primeira vez é só você colocar aqui o IP do seu local host a porta 6379 como você não tem password não tem username não tem nada é meramente dá um ok aqui que você vai entrar nessa interface Então esse aqui
é o gerenciador do redis tá E os dados Estarão aqui a partir do momento que a gente começar a enviar dados para lá então vamos fazer o teste aqui né a gente já fez as implementações vamos subir Nossa epi de novo e fazer aqui os testes então basicamente vai subir de novo aqui o swager e o Swagger ali agora vai ter apenas um método ali pra gente chamar né esse get api products aqui ah vamos executá-lo e vamos fazer um Break Point de novo acho legal a gente fazer essa interação do Break Point só para
passar passo a passo mesmo para ter ciência que que a gente não tem dúvidas tá Então vou entrar nesse método aqui e vou colocar um Break Point aqui vamos executar executando ó ele vai fazer os cach options né e inspiração slide expiration tudo mais e aqui ele vai pegar o cche Key tá nulo Ele vai tentar fazer um get set ele fez o get não vai funcionar ele vai fazer um set com o retorno do meus dados aqui então aqui seria uma chamada para banco de dados ou algum outra epi sei lá alguma coisa que
você precisa beleza retorno meus produtos e já acou o Cash e vamos ver lá na api como é que fica ó retornou os mesmos produtos e agora que a parte interessante né Vamos executar aqui ó e ele Ó lá tempo de resposta tá sendo bem rápido né porque ele tá buscando do Cash e PR provar que ele tá buscando lá do Cash se a gente abrir o Red aqui e der um refresh ol vai mostrar o products aqui ele criou aquele Cash Key que a gente colocou E aí ele tem apenas aqui ess informações que
a gente tá criando só um cach a gente criou o mesmo cach aqui se eu olhar aqui essas informações eh clicar aqui ó tá vendo as mesmas informações que a gente mandou lá mesm as mesmas informações que a gente Mandou os três produtos e tudo mais aqui é o gerenciador né do próprio redis tá vendo Então você consegue editar e tudo mais mas basicamente Nossa aplicação fez a serialização e salvou no cash como Jason tá então isso daqui durante 2 minutos ali se eu não me engano que foi a gente setou vai ficar válido e
o benefício é que qualquer aplicação não só essa minha api pode ter acesso aqui e pode pegar essa mesma informação que tá sendo coerente para todo o ecossistema Então esse é o maior benefício do que a primeira estratégia que a gente fez que tava no servidor tava basicamente acoplado com a nossa aplicação né Apesar que ele sobe na memória do Servidor mas estava acoplado ali então aqui não aqui já fica distribuído quem quiser acessar o o local host porta 6379 eh vai ter acesso aqui pro hash de produtos né pro Cash k de produtos de
forma distribuída e acho que para essa aula é isso mesmo vamos voltar rapidamente aqui no nosso slide né então é isso as considerações finais eram aquelas que eu passei para vocês né múltiplos servidores multos servidores web múltiplas aplicações serviços desacoplado criar um Cash para cada domínio então aqui é um domínio de manipulação de produto né se eu tiver outros domínios crie novos caches e malefício é que tem esse essa conexão de rede que vai est sempre ativa e vai ser um overhead pequeno na sua aplicação Mas enfim Essas são melhores práticas aqui para Cash distribuído
a gente mostrou um serviço que é o redis mas existem outras opções do mercado que vocês possam considerar também inclusive até bancos de dados aí que que são noso que também tem estratégia de Cash garantida C