如何减少memcache查找次数?

时间:2013-12-26 06:12:54

标签: python google-app-engine caching memcached jinja2

我设法摆脱了网站的所有数据存储区查询,但根据appstats,仍然有58个memcache查找,我认为可以减少到9或更少。有一个超过50个项目的迭代,我相信对于所有50个元素,每个元素的迭代查找只能在循环外完成,如果对象不是太大而可能不是。和/或一些更高级的模型可以在渲染之前缓存所有内容,因为在渲染模板后有8个memcache查找和在模板渲染后有50个:

    {% for scored_document in results %}        
    <div class="item">
        <abbr class="date dtstart value item_age" title="2013-05-07T12:48:07+0000">
             {{scored_document.fields.10.value|format_date_human(locale='en')}}<br>{% if scored_document.fields.17 and scored_document.fields.18 %}    
{{scored_document.fields.17.value|displaytime(minutes =scored_document.fields.18.value )}}{% endif %}
        </abbr>    
      {% set testing = scored_document.fields.8.value|displayimg %}
        {% if testing and testing != 'False' %}
        <a lang="" class="item_img" tabindex="1" href="/vi/{{scored_document.fields.8.value|int|safe}}.html">    
                <img src="{{ testing }}" title="{{scored_document.fields.0.value|safe}}" alt="{{scored_document.fields.0.value|safe}}">    
        </a>    
        {% else %}
        <a lang="" class="item_img" tabindex="1" href="/vi/{{scored_document.fields.8.value|int|safe}}.html">
            &nbsp;
        </a>
        {% endif %}

上面的代码调用了使用memcache的过滤函数:

def displayimg(ad_id):
    from main import Ad
    uri2view = memcache.get('uri2view'+ad_id)
    if uri2view is None:
      ad = Ad.get_by_id(long(ad_id))
      memcache.add(ad_id, ad, 36000)
      uri2view = ad.uri2view()
      if uri2view is None:
          uri2view = False
      memcache.add('uri2view'+ad_id, uri2view, 36000)
    return str(uri2view)

函数uri2view是

def uri2view(self):
    data = memcache.get('img-serv-url'+str(self.key().id()))
    if data is not None:
        return data
    else:
        if self.matched_images.get():
          data = images.get_serving_url(self.matched_images.get().primary_image.key()  ,80)
        else:
          data = False
        memcache.add('img-serv-url'+str(self.key().id()), data, 36000)
        return data

appstats的结果是58个memcache查找,后端8个,循环50个,因为for循环是50次。

HTTP 200 real=1056ms api=0ms overhead=11ms (58 RPCs, cost=0, billed_ops=[])
memcache.Get    58

现在我认为只需一个memcache查找就可以完成整个循环但是怎么做?我应该能够为循环外的所有项启动一个更大的变量,对吗?而且我也应该能够只用一次查找在后端进行8次查找,最后将这两次查找合并为1只?

1 个答案:

答案 0 :(得分:1)

您可以尝试:

即使不减少memcache调用次数,也可以批量执行displayimg处理(接受列表而不是单个元素),这样就可以节省API调用到数据存储区/ memcache的往返次数。