在现有数据库查询周围包装可选的memcached缓存很容易.例如:
旧(仅限DB):
function getX x = get from db return x end
新(带memcache的DB):
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层是可选的(即如果内存缓存已关闭,网站仍然有效)我想要两全其美,但为了这样做,我很确定我需要维护一个很多查询有两种不同的形式(1.获取索引,然后是记录;以及2.在一个查询中获取记录集).分页越复杂.使用DB,您可以执行LIMIT/OFFSET SQL查询,但是使用memcache,您只需获取PK的索引,然后批量获取数组的相关切片.
我不确定如何整齐地设计这个,有没有人有任何建议?
更好的是,如果你自己反对这一点.你怎么处理它?