2010-10-23 17 views
5

"Bulut" dışında bir Google App Engine web uygulamasını standart bir web çerçevesine (webpy) taşıyorum ve Gae'da kullanılabilen bir memcache özelliğinin nasıl uygulanacağını öğrenmek istiyorum. Sadece uzak bir API her X saatleri alınan verilerin bir demet depolamak için bu önbelleği kullanmak benim app Ev yapımı minik memcache

; Başka bir deyişle, bu önbelleği çok fazla vurgulamıyorum. Tipik bir kullanım olacağını

class TinyCache(): 
    class _Container(): 
     def __init__(self, value, seconds): 
      self.value = value 
      self.cache_age = datetime.now() 
      self.cache_time = timedelta(seconds = seconds) 
     def is_stale(self): 
      return self.cache_age + self.cache_time < datetime.now() 

    def __init__(self): 
     self.dict_cache={} 

    def add(self, key, value, seconds = 7200): 
     self.dict_cache[key] = self._Container(value, seconds) 

    def get(self, key): 
     if key in self.dict_cache: 
      if self.dict_cache[key].is_stale(): 
       del self.dict_cache[key] 
       return None 
      else: 
       return self.dict_cache[key].value 
     else: 
      return None 

:

data = tinycache.get("remote_api_data") 
if data is not None: 
    return data 
else: 
    data = self.api_call() 
    tinycache.add("remote_api_data", data, 7200) 
    return data 

Nasıl artırabilirsiniz

Ben safça böyle bir şey uyguladık?
Bunu yapmam Gerekir Thread-Safe?

+1

Bir önbellek arka ucuna bağlanan çoğu "standart web çerçeveleri" desteği ... Neden GAE arka ucunu çalıştıran bir sarmalayıcı uygulamıyorsanız, ve mevcut değilse, 'memcached' (veya Django'yu kullanmanız durumunda Django Önbellek API'sı) 'na geri döner. "Bulutsuz" bir memcache örneğine erişiminiz var mı? –

+0

Hayır, memcached bir seçenek değil çünkü sağlayıcım tarafından desteklenmiyor. Ayrıca, GAE arka ucu da bir seçenek değil. Neden hızlı olması gereken bir şey için böyle uzunca bir gidiş dönüşe ihtiyacım var? – systempuntoout

cevap

2

O nadiren kullanılan girdileri tutacak beri önbellek verimsiz büyüyebilir geliyor bana. Çünkü, belirli bir anahtar için get işlemi istenmedikçe önbelleğinizdeki girdiler kaldırılmıyor gibi görünüyor.

sana şu iki basit özellikler eklemek istiyorum önbelleği artırmak istiyorsanız: Bir Öğe Ben ilk değere seconds yeniden başlatmak olacaktır istenir

  1. . Bu nedenle, sisteminizin sıklıkla kullandığı öğeleri tutmak için.
  2. Önbelleği çaprazlamak ve çok eski girdileri silmek için ayrı bir iş parçacığı mekanizmasını uygulardım.

Ayrıca ben sadece bu tarifi buldum bu Fixed size cache

Düzenlendi

gelen bazı fikirler alabilirsiniz, bu süper serin. Temel olarak, önbellek yapmak istediğiniz mantıkla dekoratörlere sarılabilirsin. gibi bir şey:

@lru_cache(maxsize=20) 
def my_expensive_function(x, y): 
    # my expensive logic here 
    return result 

Bu LRU and LFU cache decorator dekoratörler sizin için önbellek mantığını uygulayacak. En Son En Az Kullanılan (LRU) veya En Düşük Sık Kullanılanlar (LFU) (bu referanslara bakınız Cache_algorithms)

+0

güzel puanlar, teşekkürler – systempuntoout

+0

Sadece sistem çözücüleri işlevine göre başka bir çözümle düzenlenmiş. –

+0

Aslında projemde zaten bir LRU önbelleği var. Gerçekten ihtiyacım olan şey, zamanla sona eren Öğeler için bir önbellektir. – systempuntoout

0

Uygulamamda, her X saatte bir uzak api'den alınan bir grup veriyi depolamak için bu önbelleği kullanıyorum; Başka bir deyişle, bu önbelleği çok fazla vurgulamıyorum.

...

Bunu nasıl

artırabilirsiniz

?

kodunuzu sizin için çalışıyorsa, neden rahatsız? Açıkça yorum istedi olarak

Ancak, ben yine de fikirlerimi eklemeyi deneyin. Bana göre, sadece düzenli olarak yenilenen verileri saklamak için dosyalar gibi geleneksel bir depolama alanı veya bir veri tabanı kullanabiliyorsunuz. Eğer bir kez işi ve müşteriye erişim/teslimat hızlı yani sadece bir formda verileri depolamak odaklanmak mümkün olabilir bu yüzden çok durumda biri sadece bazı (potansiyel olarak pahalı) ön işlemeyi ihtiyacı var.

Avantajları: Birden süreçler (örn FastCGI)

Ben Konu-Safe yapmak gerekir mi

  • azaltılmış bellek ayak baskı ile

    • basit
    • herhangi bir sorun? Gerçekten kullanım desen bağlıdır

  • . Ancak API'nizden sanırım, iki katına bir değer hesaplamanız gerçekten gerekmiyor (en kötü durum).