我开始向我的应用程序添加一个内存缓存层。到目前为止一切顺利。
但我很快意识到,当有人将文件上传到网站时,我将需要一次性使一大批 key 失效/删除,以保持数据的相关性。
我读过一些书,解决这个问题的最常见方法似乎是在每个键上设置一个版本号,而不是在用户上传时删除键(因为可能有很多排列)你增加版本号,在下次访问数据时引发缓存未命中。
我不知道从哪里开始才能对此进行编码,而且我不太确定我是否完全理解它。
我的代码目前看起来像这样:-
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$key = md5("songsearch_$textSearch.$rangeSearch");
上面 key var 中的两个变量是从 get 请求中获取的,get 请求又获取了大量的 JSON。 (想想产品目录)。
这些变量还决定了根据这些变量动态组合在一起的查询本身。最终,所有这一切都为我提供了一个对每个查询都是唯一的 key ,即使我可以从同一个脚本中生成数百个 key 。
我希望上面的内容很清楚,如果没有,请让我澄清任何要点,以便更好地帮助您回答我的问题。
很明显,稍后,要设置缓存我正在使用的结果:-
$memcache->set($key, $output, MEMCACHE_COMPRESSED, time() + 24*60*60*365);
就在我对 JSON 进行编码之前。
所以我的问题真的是......我如何添加某种形式的增量版本控制,以便如果用户上传文件,我可以使该脚本生成的所有 key 无效?
非常感谢至少让我走上正轨的任何人。
最佳答案
您显然走在正确的轨道上。您唯一缺少的是:在内存缓存中存储一个版本号,您可以在构建 key 之前检索该版本号。
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
// fetch the current version number
$version = $memcache->get('version_number');
// and add the version to the key
$key = md5("songsearch_$textSearch.$rangeSearch") . 'v' . $version;
所以现在,每当有人上传新内容时,您只需增加版本号:
$memcache->increment('version_number');
这会自动导致所有现有查询遇到无效条目。
为了简化访问,我建议您将其包装在一个新的 Memcache 处理程序类中(未经测试):
class VersionedMemcache extends Memcache {
const VERSION_KEY = 'version_number';
private $version = 1;
public function __construct() {
$version = parent :: get(self :: VERSION_KEY);
if ($version === false) {
$version = 1;
$this->set(self :: VERSION_KEY, $version);
}
$this->version = $version;
}
public function get($key, &$flags = null) {
$key = $key . '_v' . $this->version;
return parent :: get($key, $flags);
}
public function incVersion() {
$this->version = $this->increment(self :: VERSION_KEY);
return $this->version;
}
}
现在,您只需将脚本修改为:
$memcache = new VersionedMemcache();
$memcache->connect('localhost', 11211) or die ("Could not connect");
$key = md5("songsearch_$textSearch.$rangeSearch");
// this will now result in a fetch on 'ab23...232afe_v1' instead of 'ab23...232afe'
$result = $memcache->get($key);
// when an upload happens, simply
$memcache->incVersion();
关于PHP Memcached key 和增加版本号以使缓存无效 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436964/