使用 Memcached 实现分布式缓存






4.65/5 (19投票s)
本文介绍了使用 Memcached 实现分布式缓存的方方面面,包括在 Linux 和 Windows 上安装 Memcached 服务器,以及在 .NET 中使用它。
本文使用的工具 - 需要下载
- Memcached 管理器 - 此应用程序使我们能够管理 Windows 服务器环境中的
MemCacheD
,包括远程服务管理。 - Memcached .NET 客户端库 - C#/.NET memcached 客户端库。此库可供 .NET 项目用来访问 memcached 服务器。
- 环境:Visual Studio 2010, Ubuntu 9.10
目录
- 引言
- 在 Linux 上安装和配置 Memcached
- 使用管理器在 Windows 上安装和配置 Memcached
- 通过命令行配置 Memcached 服务器
- 在 Web 应用程序和 WinForm 中使用 Memcached
1. 引言
分布式缓存作为一个概念和最佳实践正日益受到重视。就在几年前,.NET 领域的了解者还很少,尽管 Java 社区在这方面已经走在 .NET 前面。随着应用程序事务的爆炸式增长,数据库承受着超出其极限的压力,分布式缓存现在已被接受为任何可伸缩应用程序架构的重要组成部分。
有几种内存中的分布式缓存引擎,如 Velocity、NCache、ScaleOut 和 Memcached。它们每个在可伸缩性、安全性和许可方面都有其优缺点,可以在互联网上详细了解。在本文中,我们将讨论 Memcached。
Memcached 是一个开源的、易于部署的、跨应用程序和跨平台的内存分布式引擎,这意味着可以通过多种语言(PHP、Java 和 .NET)以及 Windows、Linux 等访问同一台服务器。
在本文中,我们将安装 Linux 和 Windows 上的 Memcached 服务器,然后使用 Memcached 客户端库从 .NET 应用程序(Web 和桌面)访问这两个服务器。
2. 在 Linux 上安装和配置 Memcached
在本文中,我们将安装 Ubuntu 9.10 上的 Memcached,但您也可以在任何 Linux 平台上安装。
Memcached 使用 Libevent,因此您必须先编译并安装 Libevent。登录到 Ubuntu 并打开终端,然后在 Ubuntu 终端中运行以下命令:
wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
tar xzf libevent-1.4.14b-stable.tar.gz
cd libevent-1.4.14b-stable
./configure && make && sudo make install
系统可能会提示输入密码,请键入密码继续。现在运行以下命令编译 Memcached 服务器:
wget http://memcached.googlecode.com/files/memcached-1.4.1.tar.gz
tar xzf memcached-1.4.1.tar.gz
cd memcached-1.4.1
./configure && make && sudo make install
安装完成后,将创建两个文件夹:“libevent-1.4.14b-stable” 和 “memcached-1.4.1”,如下图所示:

现在,您可以双击从其位置运行 Memcached,或者通过终端运行,如下所示。从终端运行时,您可以配置不同的监听地址和端口选项:
Memcached –L 192.168.1.106 –P 56789
要确保 Memcached 正在运行,请键入以下命令检查状态:
sudo netstat –plntu
使用系统监视器检查 Memcached 是否正常工作
Memcached 正在运行并监听端口 56789。
现在,我们将检查 Ubuntu 正在运行的 IP 地址,以便在客户端中使用它。
点击 系统 -> 管理 -> 网络工具。
3. 使用管理器在 Windows 上安装和配置 Memcached
在此步骤中,我们将安装和配置 Windows 上的 Memcached 服务器。为此,请从文章开头的链接下载 Memcached 管理器。以管理员身份运行该工具。
添加服务器名称“localhost
”并点击添加服务器。请参考下图:
并点击添加实例按钮,配置设置。请参考下图:
确保 memcached 已启动并正在运行。我们可以使用资源监视器查看它正在运行的端口:
Memcached 正在运行并监听端口 12345。
4. 通过命令行配置 Memcached 服务器
使用命令行配置 Memcached 与我们在 Ubuntu 上所做的相同,例如:
Memcached –L 192.168.1.101 –P 12345
但是,这里列出了一些可能更有用的命令:
- -u <user> : 以 root 用户身份启动时,以指定用户身份运行
- -m <num> : 用于项的最大内存(以 MB 为单位)
- 如果超过可用 RAM - 将使用交换空间
- 请记住 32 位机器的 4G 限制
- -d : 作为守护进程运行
- -l <ip_addr> : 监听 <ip_addr>;默认为 INADDR_ANY
- -p <num> : 端口
- -s <file> : unix 套接字(禁用网络支持)
- -c <num> : 最大并发连接数
- -v : 详细模式
- -vv : (2 个 v) 非常详细模式
- -P <file> : PID 文件(与 -d 一起使用)
- -t <threads> : 用于处理传入请求的线程数。仅在启用了线程支持的情况下编译时才有效。最多仅对 CPU 数量有效
5. 在 Web 应用程序和桌面应用程序中使用 Memcached
在此步骤中,我们将从 Linux 和 Windows 访问 Memcached。为此,我们首先需要从文章开头的链接下载 Memcached .NET 客户端库。
创建一个解决方案并添加 Web 和桌面项目,如下所示:
将引用添加到两个项目中的 Memcached.ClientLibrary.dll。此程序集位于以下路径:
memcacheddotnet_clientlib-1.1.5\
memcacheddotnet\trunk\clientlib\src\clientlib\bin\2.0\Release
为了测试 Memcached 的功能,我们将通过 Web 应用程序插入一些值,然后从桌面应用程序检索它们。
Web 应用程序包含用于服务器、键、值的文本框和一个“插入 Memcached”按钮,如下所示:
在 Page_Load()
中添加以下代码片段:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string[] serverlist = { txtServer.Text };
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
}
}
在 Button1_Click()
处理程序中添加以下代码:
protected void Button1_Click(object sender, EventArgs e)
{
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = false;
mc.Set(txtkey.Text, txtValue.Text);
//SockIOPool.GetInstance().Shutdown();
}
在 btnStats_Click()
处理程序中添加以下代码:
protected void btnStats_Click(object sender, EventArgs e)
{
// Get the Statistics of memcahed server
MemcachedClient mc = new MemcachedClient();
IDictionary stats = mc.Stats();
foreach (string key1 in stats.Keys)
{
lblStats.Text += key1;
Hashtable values = (Hashtable)stats[key1];
foreach (string key2 in values.Keys)
{
lblStats.Text += key2 + ":" + values[key2] + "\r\n";
}
lblStats.Text += "\r\n";
}
}
创建的桌面应用程序包含用于服务器和键的文本框以及“获取值”按钮。

将以下代码片段写入 btnGetValue_Click()
事件处理程序:
private void btnGetValue_Click(object sender, EventArgs e)
{
string[] serverlist = { txtServer.Text };
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = false;
string value = (string)mc.Get(txtKey.Text);
MessageBox.Show(value);
}
现在,通过更改服务器和插入不同的值来测试 Memcached。
现在,将服务器更改为运行在 192.168.1.102:12345 上的 Windows Memcached,如下所示:

我们可以在管理器中的 Memcached 统计信息中看到,项计数为 1。

结论
我们已成功在 Windows 和 Linux 环境中安装了 memcached 服务器,并在我们的 ASP.NET 和 C# 项目中使用了它们。
我希望这个项目对希望实现具有分布式缓存的可伸缩解决方案的开发人员有所帮助。
我尽力用屏幕截图描述了每个步骤。希望您喜欢这篇文章。如果您喜欢这篇文章,请告诉我 :)。如果您有任何问题,请随时通过 fayaziiui@gmail.com 与我联系。
历史
- 2010 年 7 月 26 日:初始帖子