我想为我的ORM实现基于memcache的缓存。让我们假设,我的用户模型上有两个方法来获取同一组数据:
+ findById(1234);
+ findByUsername('roman');
不同的查询,相同的结果集。现在,两个结果集都由memcache缓存在不同的键下(包含mysql where语句来分隔它们)。在编辑用户模型后进行清除时非常糟糕。我必须清除2个我无法知道的键,因为键看起来像这样:
+ findById -> user_id_1234_visible_true_enabled_true (and so on)
+ findByUsername -> user_username_roman_visible_true_enabled_true (and so on)
现在的问题是,如何清除两个键。
我到目前为止找到的唯一解决方案是将findByUsername拆分为2个mysql调用:
1. findIdByUsername()
2. get id from resultset
3. findById(withFetchedId)
4. cache findById resultset
我希望你能提出另一个我能提出的解决方案。 很多!
答案 0 :(得分:1)
有一种方法可以按照ORM Cache Manual中描述的方式覆盖该特定模型上的Model::find()
和Model::findFirst()
。但我认为除非:
a)取决于您在数据库中拥有的用户数量,我可能会缓存{login: id}
的完整集合 - 小型/中型CRM案例
b)或者在需要时将其缓存一段时间:
1. if userId not in cache, fetch from findIdByUsername() and cache it under username
2. get userId from cache based on username
3. findById()
所以实际上你会不时地询问userId的查询,具有基于getUserById()
的核心功能 - 这是非常正确的方法。