2

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

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

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

4 回答 4

2

至于我的经验,您应该使用多级缓存。实现您的两个解决方案(前提是它不是唯一使用的代码"SELECT title, body FROM posts WHERE id=%%"。如果它只使用第一个)。

在代码的第二个版本中, You memcache.get(query.hash()),但是memcache.put("feed_%s" % id, query_result). 这可能无法如您所愿(除非您有一个不寻常的 hash() 版本;))。

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

顺便一提:

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

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

于 2009-05-05T19:37:18.393 回答
1

取决于使用模式,但所有事情都是平等的,我会投票支持第一种方式,因为您只会执行生成提要 1 次的工作。

于 2009-05-05T19:20:48.807 回答
1

这实际上取决于您的应用程序的功能......回答这个问题的唯一方法是从您现有的应用程序中获取一些性能数据。然后,您可以找到花费最多时间的代码并努力改进该代码。

于 2009-05-05T19:20:59.010 回答
1

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

于 2009-05-05T23:00:16.407 回答