O cache não precisa mais ser difícil. Com apenas algumas linhas de código Omoide Cache, levarão instantaneamente seus serviços Python para o próximo nível!
Biblioteca liberada : Pypi
Código fonte : Github
Tutorial №1 : meu blog ou médio
Esta é uma solução de cache na memória robusta, altamente ajustável e fácil de integrar, escrita em python puro, sem dependências.
Ele foi projetado para ser um cache de nível de método, envolvendo um método de classe única, usando os argumentos de chamada de método como chave de cache e armazenando seu valor de retorno.
Personizável para se adequar ao seu caso de uso específico, fornece várias opções de expiração e atualização.
Muito fácil de usar, super fácil de integrar a um decorador simples (por exemplo, anotação, para quem vem do Java), sem necessidade de adicionar lógica complicada ao seu código, basta usar @omoide_cache() sobre qualquer método em seus serviços. Ele será gerado automaticamente um cache para o seu método com configurações padrão. Você pode ajustar ainda mais essas configurações através dos parâmetros do decorador.
Aviso justo - Este projeto está no estágio mais antigo de seu ciclo de vida, haverá muitas melhorias e correções de bugs no futuro. Todas as sugestões e relatórios de bugs são muito bem -vindos!
pip install omoide-cachegit clone https://github.com/jpleorx/omoide-cache.git
cd omoide-cache
pip install --editable . import time
from omoide_cache import omoide_cache
# A class where cache was added to a simulated long running method
class ExampleService :
@ omoide_cache ()
def time_consuming_method ( self , x : int ) -> int :
time . sleep ( 2.0 )
return x * x
service = ExampleService ()
# The first call will execute real logic and store the result in cache
service . time_consuming_method ( 1 )
# The second call will get results from cache
service . time_consuming_method ( 1 )Aqui, adicionamos um cache que soltará um item com menos frequência quando o cache se tornar muito grande.
import time
from omoide_cache import omoide_cache , ExpireMode
class ExampleService :
@ omoide_cache ( max_allowed_size = 10 , size_expire_mode = ExpireMode . ACCESS_COUNT_BASED )
def time_consuming_method ( self , x : int ) -> int :
time . sleep ( 2.0 )
return x * x Aqui, o cache removerá automaticamente os itens que foram acessados pela última vez há mais de 2 minutos.
import time
from omoide_cache import omoide_cache
class ExampleService :
@ omoide_cache ( expire_by_access_duration_s = 120 )
def time_consuming_method ( self , x : int ) -> int :
time . sleep ( 2.0 )
return x * xComo alternativa, podemos remover itens que foram calculados há mais de 2 minutos.
import time
from omoide_cache import omoide_cache
class ExampleService :
@ omoide_cache ( expire_by_computed_duration_s = 120 )
def time_consuming_method ( self , x : int ) -> int :
time . sleep ( 2.0 )
return x * x Aqui, o cache atualizará de maneira assíncrona itens que foram calculados há mais de 2 minutos. A tentativa de atualizar será realizada a cada 10 segundos.
import time
from omoide_cache import omoide_cache , RefreshMode
class ExampleService :
@ omoide_cache ( refresh_duration_s = 120 , refresh_period_s = 10 , refresh_mode = RefreshMode . INDEPENDENT )
def time_consuming_method ( self , x : int ) -> int :
time . sleep ( 2.0 )
return x * x@omoide_cache() , mas não @omoide_cache . Sinceramente, não tenho uma ideia por que existe esse comportamento estranho nos decoradores, farei o possível para corrigi -lo em atualizações futuras.Caso você queira verificar meu outro trabalho ou entrar em contato comigo: