Легко обернуть дополнительное кэширование memcached вокруг существующих запросов к базе данных. Например:
Старый (только DB):
function getX
x = get from db
return x
end
Новое (DB с memcache):
function getX
x = get from memcache
if found
return x
endif
x = get from db
set x in memcache
return x
end
Дело в том, что не всегда, как вы хотите кэшировать. Например, выполните следующие два запроса:
-- get all items (recordset)
SELECT * FROM items;
-- get one item (record)
SELECT * FROM items WHERE pkid = 42;
Если бы я использовал вышеупомянутый псевдокод для обработки кэширования, я бы дважды сохранил все поля элемента 42. Однажды в большой набор записей и один раз сам по себе. В то время как я предпочел бы сделать что-то вроде этого:
SELECT pkid FROM items;
и кешировать этот индекс PK. Затем кешируйте каждую запись отдельно.
Итак, стратегия доступа к данным, которая лучше всего подходит для БД, не соответствует стратегии memcache. Поскольку я хочу, чтобы уровень memcache был дополнительным (т.е. если memcache не работает, сайт все еще работает), я как бы хочу иметь лучшее из обоих миров, но для этого я уверен, что мне нужно будет поддерживать много запросов в 2 разных формах (1. выборка индекса, затем записи и 2. выборка набора записей в одном запросе). Это сложнее с разбиением на страницы. С БД вы будете делать запросы LIMIT/OFFSET SQL, но с memcache вы просто получите индекс PK, а затем пакетный - получите соответствующий срез массива.
Я не уверен, как аккуратно спроектировать это, есть ли у кого-нибудь какие-либо предложения?
Еще лучше, если вы сами справитесь с этим. Как вы справляетесь с этим?