Насколько гранулированными должны быть данные в memcached? - PullRequest
2 голосов
/ 05 мая 2009

Что-то, что мне интересно ... Что было бы "наиболее эффективным" для кеширования генерации, скажем, 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 ]

2 голосов
/ 05 мая 2009

Что касается моего опыта, вы должны использовать несколько уровней кеша. Реализуйте обоих ваших решений (при условии, что это не единственный код, который использует "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 голос
/ 06 мая 2009

Как и предлагали другие, я бы профилировал ваш код и выяснил, какая самая медленная или самая дорогая часть операции.

1 голос
/ 05 мая 2009

Это действительно зависит от того, что делает ваше приложение ... Единственный способ ответить на это - получить некоторые показатели производительности из существующего приложения. Затем вы можете найти код, который занимает наибольшее количество времени и работает над его улучшением.

1 голос
/ 05 мая 2009

Зависит от схемы использования, но при прочих равных я бы проголосовал за первый способ, потому что вы будете выполнять работу по созданию канала только 1 раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...