围绕现有数据库查询包装可选的 memcached 缓存很容易。例如:
旧的(仅限 DB):
function getX
x = get from db
return x
end
新的(带有内存缓存的数据库):
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. 在一个查询中获取记录集)。分页变得更加复杂。使用 DB,您可以执行 LIMIT/OFFSET SQL 查询,但使用 memcache,您只需获取 PK 的索引,然后批量获取数组的相关切片。
我不知道如何巧妙地设计这个,有人有什么建议吗?
更好的是,如果你自己遇到了这个问题。你如何处理它?