Должен ли я использовать memcache? - PullRequest
3 голосов
/ 17 апреля 2011

Мой код создает zip-файл из Google App Engine для загрузки в браузер, т. Е. 10 КБ <размер <1000 КБ, и мне интересно, могу ли я использовать memcache здесь или файл слишком большой или ужекэшируются.Я уже использую и memcache, и устанавливаю управление кешем при генерации фактического файла первым.</p>

class KMZHandler(webapp.RequestHandler):
    def add_file(self, zip_file, url, file_name):
        """Fetch url, and add content as file_name to the zip file."""
        result = urlfetch.fetch(url)
        if not result.content:
            return
        zip_file.writestr(file_name, result.content)

    def get(self):
        """Attempt to create a zip file."""
        # you could set 'count' like this:
        # count = int(self.request.get('count', 1000))

        zipstream = StringIO.StringIO()
        zip_file = zipfile.ZipFile(zipstream, "w")

        # repeat this for every URL that should be added to the zipfile
        url = 'http://www.koolbusiness.com/list.kml'
        self.add_file(zip_file, url, "list.kml")

        # we have finished with the zip so package it up and write the directory
        zip_file.close()

        # set the headers...

        self.response.headers["Cache-Control"] = "public,max-age=%s" % 86400
        self.response.headers['Content-Type'] ='application/zip'
        self.response.headers['Content-Disposition'] = 'attachment;filename="list.kmz"'

        # create and return the output stream
        zipstream.seek(0)
        self.response.out.write(zipstream.read())
        zipstream.close()

Вот часть, которая использует memcache и создает фактический файл:

class KMLHandler(webapp.RequestHandler):
 def get(self):   
    self.response.headers["Cache-Control"] = "public,max-age=%s" % 86400
    start=datetime.datetime.now()-timedelta(days=20)
    count = int(self.request.get('count')) if not self.request.get('count')=='' else 1000        
    from google.appengine.api import memcache
    memcache_key = "ads"
    data = memcache.get(memcache_key)
    if data is None:
      a= Ad.all().filter("modified >", start).filter("url IN", ['www.koolbusiness.com']).filter("published =", True).order("-modified").fetch(count)
      memcache.set("ads", a)  
    else:
      a = data
    dispatch='templates/kml.html'
    template_values = {'a': a , 'request':self.request,}
    path = os.path.join(os.path.dirname(__file__), dispatch)
    output = template.render(path, template_values)
    self.response.headers['Content-Type'] = 'application/vnd.google-earth.kml+xml'
    self.response.headers['Content-Length'] = len(output)
    self.response.out.write(output)

Спасибо за ответы

1 Ответ

2 голосов
/ 17 апреля 2011

Если размер файла меньше 1 МБ и он не изменяется для каждого запроса, то кэширование KMZ, вероятно, уменьшит использование ресурсов.

Файл KMZ еще не находится в memcache, хотя он может находиться во внешнем кэше. Вы запоминаете результаты запроса при создании KML (см. Блог Ника для описания того, как запоминать сущности ), но кэш не принимает различные значения count или start в учетная запись. Если это не важно, вы можете также рассмотреть возможность прямого кэширования файла KML (или KMZ); если важно, вы должны исправить стратегию кэширования.

...