PHP Memcached键和递增版本号使缓存无效-如何


PHP Memcached keys and incrememnting version numbers to invalidate cache - How?

我开始在我的应用程序中添加一个memcached层。到目前为止一切顺利。

我很快意识到,然而,当有人上传一个文件到网站时,为了保持数据的相关性,我将需要一次删除大量的密钥。

我已经做了一些阅读,解决这个问题的最常见方法似乎是在每个键上设置一个版本号,然后不是在用户上传时删除键(因为可能有很多排列),而是增加版本号,导致下次访问数据时缓存丢失。

我不知道从哪里开始,为了得到这个编码,我不太确定我完全得到我的头围绕它。

我的代码现在看起来像这样:-

$memcache = new Memcache;

$memcache->connect('localhost', 11211) or die ("Could not connect");

$key = md5("songsearch_$textSearch.$rangeSearch");

上面的key var中的两个变量是从get请求中检索的,而get请求又检索了大量的JSON。(想想产品目录)。

这些变量还决定了查询本身,查询本身是根据这些变量动态组合在一起的。最终,所有这些都为我提供了一个对每个查询都唯一的键,即使从同一个脚本中,我可以生成数百个键。

我希望以上是清楚的,如果不清楚,请让我澄清任何要点,以便更好地帮助您回答我的问题。

显然,稍后,设置缓存的结果,我使用这个:-

$memcache->set($key, $output, MEMCACHE_COMPRESSED, time() + 24*60*60*365);

在我编码JSON之前。

所以我的问题是……如何在此添加某种形式的增量版本控制,以便当用户上传文件时,我可以使该脚本生成的所有密钥无效?

非常感谢那些至少让我走上正轨的人。

你的思路显然是对的。您唯一缺少的是:在memcache中存储一个版本号,在构建密钥之前检索该版本号。

$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();

你可以保存一个数组,避免键地狱