利用 Memcached 提高网页程序的运行性能

发布于 2018-01-25 20:38:37 字数 4187 浏览 2297 评论 0

当我们想到存储在 Web 应用程序我们首先想到的通常是一个传统的数据库如 MySQL。这是伟大的长期存储和数据分析,但有许多短期需要一个更好的选择 Memcached 的。这对于节约的页面请求之间的信息比特和提高性能的绝佳选择。在此介绍我们将向你展示如何开始使用 Memcached 和 PHP。

利用 Memcached 提高网页程序的运行性能

介绍

Memcached 的是简单地让你存储的东西在内存接口的服务器。这可以在同一台机器上运行,您的 Web 服务器,但可扩展性来自于跨多个服务器分布情况。所有你需要的是 Memcached 的守护进程运行和 PHP 提供了一个简单的接口与 PECL 库。在基于 Debian 的 Linux 系统,这是一样简单:

$ sudo apt-get install memcached
$ sudo service memcached start
$ sudo pecl install memcached
$ sudo service httpd restart

现在我们应该提到有技术上可与 Memcached 的工作,两个 PHP 库。旧的库称为 memcache,是缺乏某些功能的。较新的 memcached 库使用libmemcached 通常首选。

PHP 中的第一步是要连接到服务器。连接可以跨请求被持久化,这是很好的表现。然后添加到服务器列表中根据需要。在这种情况下,我们会在默认端口使用本地运行的实例:

function get_memcached() {
    // Set a persistent connection ID
    $mc = new Memcached('webapp');
    // Set a short timeout (in milliseconds) so if the server goes down
    // it doesn't take down our site with it
    $mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000);
    if ( !$mc->getServerList() ) {
        if ( !$mc->addServer('localhost', 11211) ) {
            error_log('Could not add memcached server.');
            return false;
        }
    }
    return $mc;
}

现在您可以读取和写入 PHP 变量来 Memcached 的基于您定义按键功能简单。他们将被序列化和反序列化自动。你可以不写资源,如数据库连接或结果集,但你可以把这些结果集到阵列和存储这些。

$mc->set('list', array(1, 2, 3));
$list = $mc->get('list');

存储数据

比方说我们要存储的每个登录的用户最近访问过的 URL 列表。我们可以使用会话但不会跨设备工作,它会尽快会话被清除消失。我们可以使用一个数据库,但是这是缓慢的对这种数据的最有可能并不重要,以我们的系统。使用 Memcached 这很容易:

$user_id = 123;  // The current user's ID
$recents = array();
if ($mc = get_memcached()) {
    // Get any stored in memcached
    $recents = $mc->get("recents-$user_id");
    if (!$recents) {
        $recents = array();
    }
    $recents[] = $_SERVER['REQUEST_URI'];
    $recents = array_unique($recents);
    $recents->set("recents-$user_id", $recents);
}

print_r($recents);

缓存

现在让我们真正提高你的通过缓存 Web 应用程序库的结果。数据库查询通常是在服务器处理的最大瓶颈,从而避免了缓存的结果在内存中重复的查询可以提供巨大的性能增益。最简单的方法是查询,只和主键存储。通常情况下这是最好的时候,数据库记录被更新,以便用户不会看到任何外的日期值的缓存值被删除。

function store_product($id, $name, $price) {
    // Create or update the product in the database
    $db = get_db();
    $qry = $db->prepare('REPLACE INTO product (id, name, price) VALUES (:id, :name, :price)');
    $qry->bindParam(':id', $id);
    $qry->bindParam(':name', $name);
    $qry->bindParam(':price', $price);
    $qry->execute();

    // Remove outdated values from cache if it's there
    if ($mc = get_memcached()) {
        $mc->delete("product-$id");
    }
}

function get_product($id) {
    $product = null;

    // First check the cache
    if ($mc = get_memcached()) {
        $product = $mc->get("product-$id");
    }

    if (!$product) {
        // Not in the cache; check the db
        $qry = $db->prepare('SELECT * FROM product WHERE id = $id');
        $qry->bindParam(':id', $id);
        if ($qry->execute()) {
            $product = $qry->fetch();

            // Cache for future use
            if ($mc) {
                $mc->set("product-$id", $product);
            }
        }
    }

    return $product;
}

注意事项

如同任何技术的选择也有局限性和活动注意:

  • 密钥的最大长度为 250 个字节。保持你的钥匙简短。
  • 默认的最大值大小为 1MB 左右。这是不正确的地方来存储较大的值。
  • 存储未锁定读取或写入数据库中的记录可以被锁定的方式。要知道,任何网络请求可以随时更新的任何值。
  • 要确保您的 Memcached 服务器有足够的内存组合。

下一步

还有更多你可以用 Memcached 的事:

  • 缓存的值可以有超时。当数据应被代替的缓存为一设定的时间周期手动删除,这是很有用的。
  • 简单的 incrementdecrement 方法是保持请求之间快速计数器非常有用。
  • 与memcached的正确配置你可以分享写在许多编程语言的应用程序之间的数据。

给 Memcached 的一个尝试。在正确的情况下这是一个非常简单而有效的解决方案,以最大限度地提高您的 Web 应用程序的性能。

译文:http://davidwalsh.name/memcached-intro

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文