我有一个搜索我的数据库的搜索表单,我使用当前选项缓存结果,并查询密钥以识别缓存的项目,例如
md5([query]:[search-options]:[page-number]);
由于我使用Codeigniter的缓存库进行缓存,因此在缓存搜索结果时,我将它们存储在密钥下,例如:
United States:match=yes|rooms=5|order=date|type=desc|include-pictures=true:5
因此,这指的是使用所选选项和第5页搜索United states
。这可以更改为以下内容:
United States:match=no|include-pictures=false:2
Washington, United States:match=no|include-pictures=false:2
现在这是一个问题,当记录更新时,它不会反映搜索结果,直到缓存过期,缓存结果的最佳做法是什么,更新的记录会反映这些结果(缓存) ?
答案 0 :(得分:1)
现在这是一个问题,当记录更新时,在缓存过期之前它不会反映搜索结果
也许我错过了一些东西,但通常这就是你希望缓存工作的方式。您缓存结果,使用它们来显示数据,并在缓存过期后定期刷新。
如果您始终需要最新的缓存,则可以在更新记录时明确删除缓存。只需在更新内容时擦除整个搜索结果缓存。
如果问题是您的分页不同步,请确保您也从缓存中读取分页数据。
理论上这很容易:将缓存文件写入自己的目录(很可能在默认缓存目录中)。当您需要删除属于该“组”的缓存时,只需删除该目录或其内容。
问题是Codeigniter的当前cache drivers不支持此功能,尽管它很容易集成。在此期间,您可以编写自己的驱动程序,但您可能还需要重载CI_Cache
库本身,因为它为驱动程序提供的接口不是很强大。例如,save()
方法目前看起来像这样:
/**
* Cache Save
*
* @param string Unique Key
* @param mixed Data to store
* @param int Length of time (in seconds) to cache the data
*
* @return boolean true on success/false on failure
*/
public function save($id, $data, $ttl = 60)
{
return $this->{$this->_adapter}->save($id, $data, $ttl);
}
仅使用$id, $data, $ttl
,您必须执行诸如将数组传递给自定义适配器中的某个参数之类的操作。类似的东西:
$cache_data = array(
'group' => 'search_results', // Save to this cache directory
'id' => $my_id, // Standard params
'ttl' => $my_ttl,
'data' => $my_dat,
);
$this->cache->save($cache_data);
但是,这在使用其他适配器时会中断,因此重载CI_Cache
类以更改接口。
我知道这并没有给你答案,但我确实看了这个并想分享我的结果。您可能希望推出自己的自定义解决方案,更改现有解决方案,或者只是让缓存过期并根据$ttl
进行刷新,而不必在每次数据库更新后重建它。
绝对考虑单个缓存$id
的键盘跟踪Nico Kang's solution,这样您就可以跳过我上面详述的混乱并明确删除您需要更新的缓存文件。
答案 1 :(得分:1)
使用搜索,唯一真正的解决方案是在更新行后清除缓存。 缓存需要更新的搜索结果会带来1行可以存在于无限量缓存密钥中的问题。
如何保留缓存的至少某些部分,只能删除链接到搜索的缓存项。 例如,您可以使用SEARCH启动从搜索创建的所有缓存: 当你更新一行时,你只需遍历整个缓存,并删除以SEARCH开头的那些:
还有一些其他的可能性,比如保留列表中包含所有缓存的搜索项,如果它不在那里,创建它,如果它在那里,请使用它。 每次更新一行时,只需清理此缓存项,然后再次使用空数组。 通过包含所有缓存项的列表循环可以省去一些麻烦,但每次要请求缓存时都会产生一些额外的负载。