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

标签 php mysql memcached

我目前正在使用 MySQL 和 iMagick 创建图片库。每个图像都被上传,通过 imageMagick 运行,然后将文件名和扩展名存储在 MySQL 数据库中,格式为 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 的)所以我不确定我是否以正确的方式进行此操作或者我是否'我完全以错误的方式使用这些工具。跟踪键应该调到多高的最佳方法是什么?目前我已经硬编码为四个,因为我知道它必须加载多少图像,但显然这不是正确的解决方案。

如果我能得到一些关于我的使用的评论,并可能获得一些推荐教程的链接,那就太好了!我觉得我正在一起破解一种使这项工作可行的方法,即使用表格来布置您的网页的内存缓存版本。

最佳答案

缓存的使用非常简单:

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

您可以想出三种填充缓存的方法,您将根据缓存的数据选择一种策略(有多少数据、查找/准备数据需要多长时间、使用频率如何、 “嗯”它可以被缓存)。

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

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

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

如果您只有少量项目,但访问频率很高,则第三种策略很有用。您通过这种方式减轻了数据库的大量负载(假设数据每分钟使用 1000 次,仅缓存一分钟可将查询量减少到 1 而不是 1000)。每当缓存中缺少一项时,刷新整个内容。

根据您的情况,我推荐策略 3。

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

关于php - 我是否以正确的方式使用 memcached?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16862739/

相关文章:

php - 获取选择框选项值不起作用

c++ - 从缓存中删除 key

caching - Couchbase 测试运行失败

mysql - null 与逻辑运算符一起使用

c# - 无法在 C# 中使用 gridview 正确排序

php - PHP 中的奇怪字符串

python - 使用 memcache.gets() 时出现 AttributeError

javascript - 如何在 CodeIgniter 中通过 javascript 发送帖子?

php - 有没有比在交互模式下运行更好的 PHP 控制台

php - 无法对数据库执行查询