我使用memcached保存MySQL查询结果。
我有两个问题:
SELECT * FROM groups WHERE group_id = 1
SELECT * FROM groups WHERE user_group = 23
第一个查询只返回1条记录,而第二条查询返回多条记录。
我的问题是,在第一次查询的情况下,当有人更新该记录时,我们可以轻松地使缓存记录无效。但是,如果在第二次查询的情况下更新了任何记录,那么应该使用什么标准使缓存变为无效?
更新
用户可以创建多个组。我正在为缓存中的用户保存所有组。与ID为“group1”的缓存记录一样,只有单个组的数据。但是使用“usegroup23”的缓存记录将有100个组。因此,如果用户更改其中一个组的名称,我认为无法使缓存记录无效。但唯一的方法是在“usergroup23”缓存记录中更新该组的名称。
答案 0 :(得分:0)
这取决于。有两种方法:
a)保持TTL非常短,如15秒,1分钟,并且根本不会使缓存失效。用户将看到小延迟的变化。对于不是每次都必须超级新鲜的东西来说,它是有益的。你不应该使用这种方法来改变用户信息。用户在提交表单后应立即看到更改,如果他没有看到更改,他将再次提交表单,一次又一次,然后他会生气并离开您的应用程序,永远不会回来。
b)当您修改数据库中的元素时,应该始终使该元素的所有缓存条目无效。你试图保持良好的长TTL(1小时,1天),当你改变元素A时,你应该使你保存元素数据的所有地方无效。 而不是保持在缓存" SELECT * FROM TABLE WHERE ..."我建议你只保留一套ID。
作为一个例子,你应该有像
这样的东西 SELECT * FROM groups WHERE group_id = $ID
,第二个SELECT group_id FROM groups WHERE user_group = $OTHER_ID
然后,当您编辑组group_id=1
时,您必须仅为group_id=1
详细信息的缓存设置无效,并在更改user_group属性时使user_group=$id
缓存无效。
在缓存中尝试仅保留id的集合以及有关单个对象的信息。当然这取决于案例,有时你必须保留比ID更多,但这是最安全的方法。