确定缓存无效条件


Determine Cache Invalidation criteria

我正在使用memcached保存MySQL查询结果。

我有两个问题:

SELECT * FROM groups WHERE group_id = 1
SELECT * FROM groups WHERE user_group = 23

第一个查询只返回一条记录,而第二个查询返回多条记录。

我的问题是,在第一次查询的情况下,当有人更新了缓存记录时,我们可以很容易地使该记录无效。但是,在第二次查询的情况下,当更新任何记录时,应该使用什么标准使缓存无效?

更新

一个用户可以创建多个组。我正在缓存中为一个用户保存所有组。ID为"group1"的类似缓存记录将仅具有单个组的数据。但是具有"usegroup23"的缓存记录将具有100个组。所以,若用户更改了其中一个组的名称,我认为并没有办法使缓存记录无效。但唯一的方法是在"usergroup23"缓存记录中更新该组的名称。

这取决于情况。有两种方法:

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和关于单个对象的信息。当然,这取决于具体情况,有时你必须保留更多的身份证,但这是最安全的方法。