SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
Cacheamento Lado Servidor
O processamento mais rápido é aquele que não é feito
Que Mário?
• Desenvolvedor há 15 anos
• Saindo da caixinha há 3 anos
• Foco em soluções para Contact Center
• Trabalha na G4 Solutions Software
• jmarioguedes@gmail.com
Operações Idempotentes
“Em matemática e ciência da computação, a idempotência é a
propriedade que algumas operações têm de poderem ser aplicadas
várias vezes sem que o valor do resultado se altere após a aplicação
inicial.”
https://pt.wikipedia.org/wiki/Idempot%C3%AAncia
http://www.infoq.com/br/news/2013/05/idempotent
Pegando carona na palestra do Diego Garcia...
• Em sistemas RESTful operações GET deveriam ser idempotentes.
• Em uma arquitetura baseado em micro serviços o resultado
produzido por uma instância pode ser reutilizado por outra.
• Ou seja, se a mesma chamada for feita uma ou mais vezes sob as
mesmas condições, a resposta será a mesma.
• Por que não guardar esta resposta para reutilização?
O que poderia ser cacheado?
• Resultados de processamentos, em tipos Python mesmo, serializados
com pickle
• Imagens, especialmente as processadas como em
redimensionamentos
• Listagens de consultas ao banco de dados
• E por ai vai ...
Mas isso pode virar um inferno!
• Deve-se invalidar o cache, especialmente em operações CRUD
• Um descuido e ficaremos horas procurando um problema que não
existe.
• Recomendado determinar um tempo de vida, renovando-se quando
necessário
REDIS – REmote DIctionary Server
• Banco de Dados noSQL baseado em chavevalor
• Pode ser utilizado como serviço de mensageria (Filas)
• Possui a facilidade PUBSUB
• http://redis.io/
• Cliente Python: https://pypi.python.org/pypi/redis
Não encontramos nada pronto... Existe?
• Mas beleza, o Luciano Ramalho me ensinou o que é decorator 
• https://adm.python.pro.br/
• Vamos a um exemplo simples
from pickle import dumps, loads
from redis import Redis
from pymongo import Connection
from time import time
REDIS = Redis('192.168.1.60')
MONGO = Connection('192.168.1.60', 64102)
REDIS.flushall()
# MONGO['grupy']['exemplo'].remove({})
# for i in range(0, 1000000):
# MONGO['grupy']['exemplo'].insert({'nome': 'usuario_{}'.format(i), 'equipe': 'ALPHA'})
def caching(metodo):
def buscar_ou_processar(*args, **kwargs):
chave = metodo.__name__ + ':' + ':'.join([str(item) for item in args] + [str(valor) for valor in kwargs.values()])
buffer = REDIS.get(chave)
if not buffer:
buffer = metodo(*args, **kwargs)
if buffer:
REDIS.set(chave, dumps(buffer))
return buffer
else:
return loads(buffer)
return buscar_ou_processar
@caching
def usuarios_associados(nome_equipe: str):
documentos = MONGO['grupy']['exemplo'].find({'equipe': nome_equipe})
return {'usuarios': [doc['nome'] for doc in documentos], 'quantidade': documentos.count()}
if __name__ == '__main__':
agora = time()
usuarios_associados(nome_equipe='ALPHA')
print('Tempo', time() - agora)
agora = time()
usuarios_associados(nome_equipe='ALPHA')
print('Tempo', time() - agora)
O exemplo foi absurdo justamente para
mostrar a importância do assunto
C:Python34python.exe "C:Program Files (x86)JetBrainsPyCharm
4.5helperspydevpydevd.py"--multiproc --client 127.0.0.1--port 50827--
file F:/GruPy/exemplo.py
pydev debugger: process 5628is connecting
Connected to pydev debugger (build 141.1899)
1ª vez | Tempo 123.25300002098083
2ª vez | Tempo 19.740999937057495
Process finished with exit code -1
Pontos de atenção!
• Só vale a pena se o método em questão depender de comunicação
com outros softwares como banco de dados por exemplo.
• O Python oferece o decorator functools.lru_cache
• Cuide da invalidação de cache, pela sua sanidade mental.
Obrigado!
• Em memória de Wanc Guttemberg, com quem aprendi muito pelos
códigos da vida.

Más contenido relacionado

La actualidad más candente

Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014
Adler Medrado
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
Felipe Ribeiro
 

La actualidad más candente (20)

Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
 
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
Introdução FireDACAcesso multi-banco para Delphi e C++ BuilderIntrodução FireDACAcesso multi-banco para Delphi e C++ Builder
Introdução FireDAC Acesso multi-banco para Delphi e C++ Builder
 
Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014
 
Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014Migrando aplicações para FireDac - Embarcadero Conference 2014
Migrando aplicações para FireDac - Embarcadero Conference 2014
 
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTIDelphi Conference 2012 - Programação Baseado em Regras com RTTI
Delphi Conference 2012 - Programação Baseado em Regras com RTTI
 
FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015FireDAC - Embarcadero Conference 2015
FireDAC - Embarcadero Conference 2015
 
Delphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no CódigoDelphi Conference 2012 - Qualidade no Código
Delphi Conference 2012 - Qualidade no Código
 
Entendendo Conceitos Caching com PHP
Entendendo Conceitos Caching com PHPEntendendo Conceitos Caching com PHP
Entendendo Conceitos Caching com PHP
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
 
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
 
gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?
 
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NETTDC2016POA | Trilha .NET -  Trazendo o poder dos containers ao mundo .NET
TDC2016POA | Trilha .NET - Trazendo o poder dos containers ao mundo .NET
 
TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7TDC2016POA | Trilha .NET - O que esperar do C# 7
TDC2016POA | Trilha .NET - O que esperar do C# 7
 
PHP 7 - A Maioridade do PHP
PHP 7 - A Maioridade do PHPPHP 7 - A Maioridade do PHP
PHP 7 - A Maioridade do PHP
 
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
 
PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
 
FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Segurança em Aplicações Web com PHP
Segurança em Aplicações Web com PHPSegurança em Aplicações Web com PHP
Segurança em Aplicações Web com PHP
 
Desenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyDesenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2py
 

Similar a Cacheamento Lado Servidor

Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 
Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151
alderleysousa444
 

Similar a Cacheamento Lado Servidor (20)

Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Django Básico
Django BásicoDjango Básico
Django Básico
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.Python: Cabe no seu bolso, no seu micro, no seu cérebro.
Python: Cabe no seu bolso, no seu micro, no seu cérebro.
 
PHP Tools for Fast coding
PHP Tools for Fast codingPHP Tools for Fast coding
PHP Tools for Fast coding
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
Machine Learning Black Boxes
Machine Learning Black BoxesMachine Learning Black Boxes
Machine Learning Black Boxes
 
TDC2016SP - Machine Learning Black Boxes - Terceirizando o Trabalho Duro
TDC2016SP - Machine Learning Black Boxes - Terceirizando o Trabalho DuroTDC2016SP - Machine Learning Black Boxes - Terceirizando o Trabalho Duro
TDC2016SP - Machine Learning Black Boxes - Terceirizando o Trabalho Duro
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a Otimização
 
TDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e featureTDC2018SP | Trilha Arq .Net - Performance e feature
TDC2018SP | Trilha Arq .Net - Performance e feature
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Python e 10 motivos por que devo conhece-la ?
Python e 10 motivos por que devo conhece-la ?Python e 10 motivos por que devo conhece-la ?
Python e 10 motivos por que devo conhece-la ?
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151Aula05-ProgramacaoparaWeb123456878915151
Aula05-ProgramacaoparaWeb123456878915151
 

Más de Mario Guedes

Más de Mario Guedes (20)

O que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST SummitO que é e como devo usar o REDIS? - 1o Mobile REST Summit
O que é e como devo usar o REDIS? - 1o Mobile REST Summit
 
Fazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDISFazendo barba, cabelo e bigode com REDIS
Fazendo barba, cabelo e bigode com REDIS
 
Integrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da EthereumIntegrando-se à Blockchain da Ethereum
Integrando-se à Blockchain da Ethereum
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Expressão Regular - Cookbook
Expressão Regular - CookbookExpressão Regular - Cookbook
Expressão Regular - Cookbook
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google Maps
 
Foco no app, viva o serverless!
Foco no app, viva o serverless!Foco no app, viva o serverless!
Foco no app, viva o serverless!
 
Geolocalização com Redis e Google Maps
Geolocalização com Redis e Google MapsGeolocalização com Redis e Google Maps
Geolocalização com Redis e Google Maps
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!
 
Escalabilidade com Redis
Escalabilidade com Redis Escalabilidade com Redis
Escalabilidade com Redis
 
Escalando o backend com NGINX e Redis
Escalando o backend com NGINX e RedisEscalando o backend com NGINX e Redis
Escalando o backend com NGINX e Redis
 
Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!Turbinando o seu sistema com Redis!
Turbinando o seu sistema com Redis!
 
Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?Microsserviço, Escalabilidade e Resiliência - #comofas?
Microsserviço, Escalabilidade e Resiliência - #comofas?
 
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no DelphiTDCSP - 2018 - Possibilidades com o REDIS no Delphi
TDCSP - 2018 - Possibilidades com o REDIS no Delphi
 
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
Extreme Experience 2018 | Estudo de Caso: Aplicação DataSnap para 10.000 usuá...
 
Extreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe DelphiExtreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe Delphi
 
Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?Intensive Delphi 2017 - E este tal de Redis hein?
Intensive Delphi 2017 - E este tal de Redis hein?
 
BOT: Conversando com o seu sistema
BOT: Conversando com o seu sistemaBOT: Conversando com o seu sistema
BOT: Conversando com o seu sistema
 
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
Uma perspectiva histórica e o cenário atual das ferramentas de desenvolviment...
 
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuáriosExtreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
Extreme 360º 2017 | Arquitetura Extrema: Rumo aos 10.000 usuários
 

Cacheamento Lado Servidor

  • 1. Cacheamento Lado Servidor O processamento mais rápido é aquele que não é feito
  • 2. Que Mário? • Desenvolvedor há 15 anos • Saindo da caixinha há 3 anos • Foco em soluções para Contact Center • Trabalha na G4 Solutions Software • jmarioguedes@gmail.com
  • 3. Operações Idempotentes “Em matemática e ciência da computação, a idempotência é a propriedade que algumas operações têm de poderem ser aplicadas várias vezes sem que o valor do resultado se altere após a aplicação inicial.” https://pt.wikipedia.org/wiki/Idempot%C3%AAncia http://www.infoq.com/br/news/2013/05/idempotent
  • 4. Pegando carona na palestra do Diego Garcia... • Em sistemas RESTful operações GET deveriam ser idempotentes. • Em uma arquitetura baseado em micro serviços o resultado produzido por uma instância pode ser reutilizado por outra. • Ou seja, se a mesma chamada for feita uma ou mais vezes sob as mesmas condições, a resposta será a mesma. • Por que não guardar esta resposta para reutilização?
  • 5. O que poderia ser cacheado? • Resultados de processamentos, em tipos Python mesmo, serializados com pickle • Imagens, especialmente as processadas como em redimensionamentos • Listagens de consultas ao banco de dados • E por ai vai ...
  • 6. Mas isso pode virar um inferno! • Deve-se invalidar o cache, especialmente em operações CRUD • Um descuido e ficaremos horas procurando um problema que não existe. • Recomendado determinar um tempo de vida, renovando-se quando necessário
  • 7. REDIS – REmote DIctionary Server • Banco de Dados noSQL baseado em chavevalor • Pode ser utilizado como serviço de mensageria (Filas) • Possui a facilidade PUBSUB • http://redis.io/ • Cliente Python: https://pypi.python.org/pypi/redis
  • 8. Não encontramos nada pronto... Existe? • Mas beleza, o Luciano Ramalho me ensinou o que é decorator  • https://adm.python.pro.br/ • Vamos a um exemplo simples
  • 9. from pickle import dumps, loads from redis import Redis from pymongo import Connection from time import time REDIS = Redis('192.168.1.60') MONGO = Connection('192.168.1.60', 64102) REDIS.flushall() # MONGO['grupy']['exemplo'].remove({}) # for i in range(0, 1000000): # MONGO['grupy']['exemplo'].insert({'nome': 'usuario_{}'.format(i), 'equipe': 'ALPHA'}) def caching(metodo): def buscar_ou_processar(*args, **kwargs): chave = metodo.__name__ + ':' + ':'.join([str(item) for item in args] + [str(valor) for valor in kwargs.values()]) buffer = REDIS.get(chave) if not buffer: buffer = metodo(*args, **kwargs) if buffer: REDIS.set(chave, dumps(buffer)) return buffer else: return loads(buffer) return buscar_ou_processar @caching def usuarios_associados(nome_equipe: str): documentos = MONGO['grupy']['exemplo'].find({'equipe': nome_equipe}) return {'usuarios': [doc['nome'] for doc in documentos], 'quantidade': documentos.count()} if __name__ == '__main__': agora = time() usuarios_associados(nome_equipe='ALPHA') print('Tempo', time() - agora) agora = time() usuarios_associados(nome_equipe='ALPHA') print('Tempo', time() - agora)
  • 10. O exemplo foi absurdo justamente para mostrar a importância do assunto C:Python34python.exe "C:Program Files (x86)JetBrainsPyCharm 4.5helperspydevpydevd.py"--multiproc --client 127.0.0.1--port 50827-- file F:/GruPy/exemplo.py pydev debugger: process 5628is connecting Connected to pydev debugger (build 141.1899) 1ª vez | Tempo 123.25300002098083 2ª vez | Tempo 19.740999937057495 Process finished with exit code -1
  • 11. Pontos de atenção! • Só vale a pena se o método em questão depender de comunicação com outros softwares como banco de dados por exemplo. • O Python oferece o decorator functools.lru_cache • Cuide da invalidação de cache, pela sua sanidade mental.
  • 12. Obrigado! • Em memória de Wanc Guttemberg, com quem aprendi muito pelos códigos da vida.