我是否以正确的方式使用memcached?

时间:2013-05-31 17:28:21

标签: php mysql memcached

我目前正在使用MySQL和iMagick创建一个图像库。每个图像都被上传,通过imageMagick运行,然后将文件名和扩展名存储在MySQL DB中,格式为PID,文件名,扩展名。我可以遍历数据库,使用下面的代码将所有图像打印到页面中:

$gallerySQL = mysqli_query($connection, "SELECT * FROM gallery");
while($row = mysqli_fetch_array($gallerySQL)){
    $file = $row['filename'].$row['ext'];
    $thumb = $row['filename']."-thumb.png";
    $blur = $row['filename']."-thumbB.png";
    ?>
    <a href="<?php echo $file ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a>
    <?php
}
?>

但是,我不确定如何在其中实现memcached。图像库不会经常更改,因此它似乎是一个很好的缓存候选者,而不是每次页面加载时都会进行多次数据库命中。我写的代码是:

$num = 0;
$key = "img_".$num;
$pics = mysqli_query($connection, "SELECT * FROM gallery");

while($num<4){
while($row = mysqli_fetch_array($pics)){
    $key = "img_".$num;
    if(!$mem->get($key)){

        $file = $row['filename'].$row['ext'];
        $thumb = $row['filename']."-thumb.png";
        $blur = $row['filename']."-thumbB.png";
        ?>
        <a href="<?php echo $file; ?>"><img src="<?php echo $thumb ?>" onmouseover="this.src='<?php echo $blur ?>'" onmouseout="this.src='<?php echo $thumb ?>'" alt="Loaded from DB" /></a>
        <?php

        $key = "img_".$num;
        $mem->add($key, $row['filename']);  

        $key = "ext_".$num;
        $mem->add($key, $row['ext']);

    } else {
        $key = "img_".$num;
        $file = $mem->get($key);
        $key = "ext_".$num;
        $ext = $mem->get($key);
        ?>
        <a href="<?php echo $file.$ext; ?>"><img src="<?php echo $file."-thumb.png" ?>" onmouseover="this.src='<?php echo $file."-thumbB.png" ?>'" onmouseout="this.src='<?php echo $file."-thumb.png" ?>'" alt="Loaded from MemCached" /></a>
        <?php
    }
    $num++;
} // end while(row)
}// end while(num)
?>

这看起来很好,或者看起来如此,但是我找不到很多关于MemCached的教程(大多数似乎都在MemCache上)所以我不确定我是否会以正确的方式进行此操作或者如果我m完全以错误的方式使用工具。跟踪密钥有多高的最佳方法是什么?目前我已经硬编码了四个,因为我知道它需要加载多少个图像,但显然这不是正确的解决方案。

如果我可以对我的用法进行一些批评,并且可能链接到一些推荐的教程,那就太棒了!我觉得我正在混淆一种使用这种工作的方法,即使用表格来布置你的网页的memcached版本。

1 个答案:

答案 0 :(得分:0)

缓存使用非常简单:

  1. 检查缓存以查找项目
  2. 如果不存在,则获取(或创建)它并将其放入缓存
  3. 发送物品
  4. 您可以考虑三种填充缓存的方法,您可以根据缓存的数据选择策略(数据量,查找/准备数据需要多长时间,使用频率,如何使用“好”它可以缓存。

    • 一次获取一个项目
    • 一次获取多个项目
    • 一次获取所有项目

    第一种策略是当数据的创建花费相当长的时间并且数据“可以”缓存时(可以在缓存中保持合理的时间)。创建缓存条目可能需要更长的时间,后续调用将在缓存中找到数据并且速度非常快。

    第二种策略是当您拥有大量可缓存记录并且可以在可恢复时间内确定子集并且数据不会频繁更改(“可缓存”)时。 此策略还可用于预取可设置的项目,例如“获取此ID和以下10,因为它们可能会在几个时刻使用”。

    如果你只有少量的项目,那么第三种策略很有用,但是它们经常被访问。你以这种方式从数据库中获取大量负载(假设数据每分钟使用1000次,缓存只需一分钟就可以将查询量减少到1而不是1000)。每当缓存中缺少某个项目时,请刷新整个项目。

    根据你的情况,我建议采用策略3。

    检查所需项目的缓存。如果它不存在,获取整个记录列表并将所有内容放入缓存中,使用每个项目的唯一键(并且不要忘记记住挑选所请求的项目)。 在后续查找中,应该从缓存中找到并提供每条记录。