1

我目前正在使用 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 上)所以我不确定我是否以正确的方式进行此操作,或者我是否正在使用工具完全以错误的方式。跟踪键应该有多高的最佳方法是什么?目前我已经硬编码为四个,因为我知道它必须加载多少图像,但显然这不是正确的解决方案。

如果我能得到一些关于我的使用的批评,可能还有一些推荐教程的链接,那就太好了!我觉得我正在拼凑一种方法来完成这项工作,即使用表格来布置网页的 memcached 版本。

4

1 回答 1

0

缓存的使用很简单:

  1. 检查缓存以查找项目
  2. 如果不存在,则获取(或创建)它并将其放入缓存中
  3. 交付物品

您可以考虑三种填充缓存的方法,然后根据缓存的数据(数据量、查找/准备数据需要多长时间、使用频率、“好”程度)选择策略它可以被缓存)。

  • 一次取一件物品
  • 一次获取多个项目
  • 一次获取所有项目

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

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

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

为了把它归结为你的情况,我推荐策略 3。

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

于 2013-06-02T13:48:13.493 回答