代码之家  ›  专栏  ›  技术社区  ›  dbr

memcached中的数据应该有多细?

  •  2
  • dbr  · 技术社区  · 17 年前

    我很好奇的事…什么是“最有效的”缓存生成,比如说,一个rss提要?或者一个api响应(比如 /api/films/info/a12345 )

    例如,我是否应该缓存整个提要,并尝试将其作为psuedo代码返回:

    id = GET_PARAMS['id']
    cached = memcache.get("feed_%s" % id)
    if cached is not None:
        return cached
    else:
        feed = generate_feed(id)
        memcache.put("feed_%s" % id, feed)
        return feed
    

    或者缓存查询结果,每次生成文档?

    id = sanitise(GET_PARMS['id'])
    query = query("SELECT title, body FROM posts WHERE id=%%", id)
    
    cached_query_result = memcache.get(query.hash())
    if cached_query_result:
        feed = generate_feed(cached_query_result)
        return feed
    else:
        query_result = query.execute()
        memcache.put("feed_%s" % id, query_result)
        feed = generate_feed(query_result)
    

    (或者,我错过了别的方式?)

    4 回复  |  直到 17 年前
        1
  •  2
  •   Paweł Polewicz    17 年前

    根据我的经验,您应该使用多级缓存。实施 二者都 你的解决方案(前提是它不是唯一使用 "SELECT title, body FROM posts WHERE id=%%" . 如果只使用第一个)。

    在代码的第二个版本中,您 memcache.get(query.hash()) 但是 memcache.put("feed_%s" % id, query_result) . 这可能无法按您所希望的方式工作(除非您有一个异常版本的hash();)。

    我会避免 query.hash() . 最好使用类似posts title body-%id的内容。当视频作为 HASH() . 它可以作为僵尸视频挂在那里几个月。

    顺便说一句:

    id = GET_PARMS['id']
    query = query("SELECT title, body FROM posts WHERE id=%%", id)
    

    您从get中获取一些内容并将其放入sql查询中?这很糟糕(会导致sql注入攻击)。

        2
  •  1
  •   paxdiablo    17 年前

    取决于使用模式,但一切都一样,我会投票给第一种方式,因为您只需要一次生成feed。

        3
  •  1
  •   David    17 年前

    这真的取决于你的应用程序做什么…回答这个问题的唯一方法是从现有应用中获取一些性能数据。然后,您可以找到花费最大时间的代码,并致力于改进该代码。

        4
  •  1
  •   James C    17 年前

    正如其他人在这里建议的那样,我将分析您的代码,并找出操作中最慢或最昂贵的部分。