如何在Ubuntu12.04上安装和使用Memcache
状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅:
本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
关于内存缓存
Memcache 是一个通过缓存服务器信息来加速虚拟专用服务器的系统。 该程序允许您分配特定数量的服务器内存来缓存最近查询的数据一段时间。 一旦再次请求数据,memcache 通过显示缓存信息而不是从数据库生成结果来加快检索过程。
设置
本教程中的步骤要求用户具有 root 权限。 您可以在 基本用户教程 中查看如何设置。 在开始之前,最好更新 apt-get 以确保我们下载到 VPS 的所有软件包都是最新的。
sudo apt-get update
此外,您应该在虚拟服务器上安装 MySQL 和 PHP。
sudo apt-get install mysql-server php5-mysql php5 php5-memcache
安装内存缓存
安装 memcache 需要几个步骤。
首先,通过 apt-get 安装 memcached。
sudo apt-get install memcached
下一步是安装 php-pear,即存储 memcache 的存储库。
sudo apt-get install php-pear
如果您的服务器上没有编译器,您可以下载 build-essential 以安装 memcache:
sudo apt-get install build-essential
最后使用PECL(PHP Extension Community Library)安装memcache:
sudo pecl install memcache
当系统询问您是否要“启用 memcache 会话处理程序支持? [是的] :”
在 VPS 上使用 PECL 完成 memcache 的安装后,将 memcached 添加到 memcache.ini:
echo "extension=memcache.so" | sudo tee /etc/php5/conf.d/memcache.ini
现在您已准备好开始使用 Memcache。
确认 Memcache 并查看统计信息
Memcache下载完成后,可以通过搜索查看是否已安装:
ps aux | grep memcache
此外,您可以通过键入以下内容查看 memcache 统计信息:
echo "stats settings" | nc localhost 11211
第三步——Memcache 的工作原理
Memcache 的工作原理是将代码重定向到首先尝试从缓存中检索数据,然后再查询服务器的数据库。 通过将最近检索的服务器数据保存一段时间来填充缓存。 通过缓存最近请求的信息,未来的查询不必经历从数据库中检索信息的较长过程,而是可以通过缓存访问它。
memcache 页面在其主页上显示了这个缩写代码来总结 memcache 过程:
function get_foo(foo_id) foo = memcached_get("foo:" . foo_id) return foo if defined foo foo = fetch_foo_from_database(foo_id) memcached_set("foo:" . foo_id, foo) return foo end
一个简单的 Memcache 示例
本节将设置一个简单的 php 脚本,以使用 memcache 检索最初在 mysql 表中找到的单个值。
以下步骤设置了一个 mysql 用户,该用户可以访问相应的数据库,创建一个要查询的表,并将我们将要测试的一个值插入到新的 mysql 表中。
登录mysql:mysql -u root -p
,执行以下命令:
use test; grant all on test.* to test@localhost identified by 'testing123'; create table example (id int, name varchar(30)); insert into example values (1, "new_data"); exit;
退出 MySQL 后,创建 memcache 脚本文件:
nano memtest.php
我们现在将逐步构建 php 脚本(整个脚本将在本节的末尾):
首先创建一个与 memcache 的新持久连接,该连接在 memcache 的默认端口 11211 上运行。
<?php $meminstance = new Memcache(); $meminstance->pconnect('localhost', 11211);
下一步是使用我们之前创建的用户连接到新的 mysql 数据库:
mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("test") or die(mysql_error());
之后,继续创建我们将向服务器提出的查询,并提供一个键来识别该特定操作:
$query = "select id from example where name = 'new_data'"; $querykey = "KEY" . md5($query);
该脚本首先在缓存中搜索查询的答案。 如果结果不存在,则脚本将问题重新路由到原始数据库。 一旦原始数据库回答了查询,脚本将使用“set”命令将结果存储在 memcache 中——既保存它又允许用户指定它应该在缓存中保留的秒数(600会将其保存在缓存中 10 分钟)。 当我们第一次运行脚本时,它会告诉我们数据是从 mysql 数据库中收集的。 然而,当它这样做时,它将信息存储在缓存中,以便脚本的第二次运行从缓存中检索它并让用户知道。
10 分钟后缓存再次清空,运行脚本将使其再次访问数据库。
$result = $meminstance->get($querykey); if (!$result) { $result = mysql_fetch_array(mysql_query("select id from example where name = 'new_data'")) or die('mysql error'); $meminstance->set($querykey, $result, 0, 600); print "got result from mysql\n"; return 0; } print "got result from memcached\n"; return 0; ?>
整个脚本看起来像这样:
<?php $meminstance = new Memcache(); $meminstance->pconnect('localhost', 11211); mysql_connect("localhost", "test", "testing123") or die(mysql_error()); mysql_select_db("test") or die(mysql_error()); $query = "select id from example where name = 'new_data'"; $querykey = "KEY" . md5($query); $result = $meminstance->get($querykey); if (!$result) { $result = mysql_fetch_array(mysql_query("select id from example where name = 'new_data'")) or die('mysql error'); $meminstance->set($querykey, $result, 0, 600); print "got result from mysql\n"; return 0; } print "got result from memcached\n"; return 0; ?>
在命令行上运行脚本会产生以下结果:
# php memtest.php got result from mysql # php memtest.php got result from memcached # php memtest.php got result from memcached
结论
本教程介绍了通过将数据库连接到内存缓存来加快从数据库中检索数据的速度。 但是,请记住,memcache 的优势源于缓存这一事实——它不是数据存储。 使用 memcache 时,不要期望它会替换数据库。 因为 memcache 只保存给定键的设定时间长度的值,所以您可能并不总能找到需要缓存的信息,在这种情况下,必须拥有原始服务器数据库。
尽管如此,memcache 是一个非常有用的程序,可以大大提高服务器效率。
如果您对 Memcache 有任何其他问题,请随时在我们的 论坛 上询问具体信息。