memcached中的数据应该多么精细?

时间:2009-05-05 19:09:04

标签: caching performance memcached

我很好奇的东西..什么是“最有效”缓存一代RSS源?或API响应(如对/api/films/info/a12345的回复)。

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

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 个答案:

答案 0 :(得分:2)

至于我的经验,你应该使用多级缓存。实现两个您的解决方案(前提是它不是唯一使用"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之类的东西。尝试将视频作为query.hash()存储在缓存中时删除。它可以挂在那里好几个月作为僵尸视频。

顺便说一下:

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

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

答案 1 :(得分:1)

取决于使用模式,但是所有条件都相同,我会投票给第一种方式,因为你只会做一次生成Feed的工作。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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