我开始在我的应用程序中添加一个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();