我是memcached的新手.此代码是否容易受到过期缓存竞争条件的影响?你会如何改进它?
$memcache = new Memcache;
$memcache->connect('127.0.0.1');
$arts = ($memcache===FALSE) ? FALSE : $memcache->get($qparams);
if($arts===FALSE) {
$arts=fetchdb($q, $qparams);
$memcache->add($qparams, $arts, MEMCACHE_COMPRESSED, 60*60*24*3);
}
if($arts<>FALSE) {
// do stuff
} else {
// empty dataset
}
Run Code Online (Sandbox Code Playgroud)
假设查询X得到100行.排在第50行之后的另一个过程(假设零售价格上涨).
此代码是否容易受到过期缓存竞争条件的影响?你会如何改进它?
是的。如果两个(或更多)同时客户端尝试从缓存中获取相同的密钥并最终从数据库中提取它。数据库将会出现峰值,并且在一段时间内数据库将处于重负载状态。这称为缓存踩踏。有几种方法可以处理这个问题:
有关更多信息,请查看memcached 常见问题解答。
假设查询 X 获取 100 行。不久后,第 50 行被另一个进程修改(假设零售价格增加)。
缓存中有三种类型的数据:
我通常做的是将对象保留为单独的键,然后在列表中使用缓存“指针”。在您的情况下,您在缓存中的某处有 N 个对象(假设键是1,2..N),然后您在 array 中拥有对象列表array(1,2,3,10,42...)。当您决定加载包含对象的列表时,您可以从缓存加载列表键,然后从缓存加载实际对象(用于getMulti减少请求)。在这种情况下,如果任何对象被更新,您只在一个位置更新它,并且它会在所有地方自动更新(更不用说使用这种技术可以节省大量空间)。
编辑:决定添加更多有关前瞻时间到期的信息。
您使用过期数据设置对象x并将其保存到数据库中,过期日期为x+5minutes。这是从缓存加载对象时执行的步骤:
time() - x < 0)+ ":lock"我通常通过添加一个单独的键并在末尾添加原始键值来实现此目的。您必须将此密钥设置为在尽可能短的时间内过期(对于 memcached 为 1 秒)。希望这能澄清一切:)
| 归档时间: |
|
| 查看次数: |
920 次 |
| 最近记录: |