【问题标题】:Am I using memcached in the correct way?我是否以正确的方式使用 memcached?
【发布时间】:2013-05-31 17:28:21
【问题描述】:

我目前正在使用 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 版本。

【问题讨论】:

    标签: php mysql memcached


    【解决方案1】:

    缓存的使用很简单:

    1. 检查缓存以查找项目
    2. 如果不存在,获取(或创建)它并放入缓存中
    3. 发货

    您可以想出三种填充缓存的方法,然后根据缓存的数据(数据量、查找/准备数据需要多长时间、使用频率、如何“好吧”它可以被缓存)。

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

    第一个策略是当数据的创建需要相当长的时间并且数据“很好”可缓存(可以在缓存中保留一段合理的时间)时。缓存条目的创建可能需要更长的时间,后续调用会在缓存中找到数据并且会非常快。

    第二种策略是当你有很多可缓存的记录并且可以在合理的时间内确定一个子集并且数据不会经常更改(“可缓存”)。 此策略也可用于预取可推测的项目,例如“获取此 ID 和以下 10 个,因为它们可能会在一段时间内使用”。

    如果您只有少量的项目,第三种策略很有用,但它们经常被访问。通过这种方式,您减轻了数据库的大量负载(想象每分钟使用数据 1000 次,缓存一分钟将查询量减少到 1 次而不是 1000 次)。每当缓存中缺少一个项目时,刷新整个项目。

    为了解决你的情况,我推荐策略 3。

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

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2012-07-03
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多