65.9K
CodeProject 正在变化。 阅读更多。
Home

WinMemcached - 一个 C# Key/Value 服务器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (4投票s)

2015 年 2 月 27 日

CPOL

4分钟阅读

viewsIcon

17849

downloadIcon

210

WinMemcached 是一个 C# 多线程键值服务器。它的目的是作为一个测试服务器,供希望在 Windows 机器上开发 Memcache 相关项目,但部署在 Linux 环境中的开发人员使用。

引言

WinMemcached 是一个 Windows 多线程键值服务器。它的目的是作为一个测试服务器,供希望在 Windows 中开发,但部署在 Linux 环境中的开发人员使用。

Memcached 是一个键值服务器,它将任意数据的少量片段存储在内存中。它的用途可以应用于许多类型的应用程序,但通常用于 Web 应用程序,主要用于存储会话数据。读写内存比读写磁盘快得多,这就是为什么高流量网站倾向于在某种程度上使用 Memcache

在 Linux 上安装和配置 Memcached 的时间不会超过泡一杯糟糕的茶,但在 Windows 上,如果您必须从源代码编译,它可能会令人沮丧。网上流传着 32 位和 64 位版本的二进制文件,但正如我发现的那样,大多数都是损坏的。我的情况是,我需要在 Windows 上开发,但部署在 Linux 环境中。在从不同来源下载了各种二进制版本并替换了 DLL 文件数小时后,我开始想是否有其他解决方案可以使用。

由于我只需要 Memcached 用于测试目的,我认为创建一个模拟 Memcache 客户端库,将其写入文件系统可能更容易。当部署到生产服务器时,我只需在 git 提交中忽略模拟 Memcache 库,这将导致在生产中使用真正的 Memcache 客户端库。整个要点是使用 Memcached 将数据存储在内存中,而在我的开发环境中,我可以用将数据存储到文件系统来代替将数据存储到内存的过程。

用 PHP 开发模拟 Memcache 库非常简单。我只需要创建一个名为 Memcache 的类,并实现一些常用的方法,如 connectaddsetgetflush

class Memcache {

	public function connect($host, $port = null){
		// Let's fake it and open a file for reading
		// and load it with an empty key/value array
	}
	
	public function add($key, $value){
		// Add the item if the key doesn't exists in the array
	}
	
	public function set($key, $value){
		// Add the item, no need to check if it exists
	}
	
	public function get($key){
		// Check item exists in array and return it
	}
	
	public function delete($key){
		// Delete item from array
	}
	
	public function flush(){
		// Remove all elements from the array
	}
	
	public function close(){
		// Close the file
	}
}

模拟 Memcache 类只需打开一个文件进行读写。键/值 数据存储在一个数组中,该数组被序列化并保存到文件中。我写了一些测试,它们在我的 Windows 开发服务器上通过了。然后我部署到生产环境,并在 git 提交中忽略了模拟 Memcache 类,代码按预期执行。

虽然这种方法效果很好,但我决定更进一步,开发一个 模拟 Memcached C# 服务器。一个多线程服务器,它使用基于命令的协议来设置和获取存储在内存中的值。经过几个小时的 hacking,我终于构建了一个基本的控制台服务器。

服务器侦听用户选择的端口上的客户端连接。一旦建立连接,就会创建一个新线程来服务客户端。客户端向服务器发送 XML 格式的命令。父 XML 节点是命令类型,而子节点是命令参数。

命令示例

本节描述了服务器支持的所有命令。

<a><k>customer</k><v>John Smith</v></a>

XML 命令包含一个父 a 元素和两个子元素 kva 命令告诉服务器存储键为 k、值为 v 的数据。服务器将在添加之前检查键是否不存在。成功时,服务器响应 200.Added 消息。如果键已存在,服务器响应 204.Duplicate Key 消息。

<s><k>customer</k><v>John Smith</v></s>

a 命令相同,s 命令在添加到集合之前不检查键是否存在。此命令用于添加和更新集合。成功时,服务器响应 200.Added 消息。

<g><k>customer</k></g>

g 命令从集合中请求一个值。它有一个参数 k,指定键名。成功时,服务器响应 200.后面跟着键值。如果请求的键不存在,服务器响应 204.Not found 消息。

<r><k>customer</k></r>

r 命令删除集合中具有给定键名的项。成功时,服务器响应 200.Removed 消息。如果请求的键不存在,服务器响应 204.Not found 消息。

<c></c>

c 命令从集合中删除所有项。它不接受任何参数。成功时,服务器响应 200.Cleared 消息。

<st></st>

st 命令要求服务器返回有关其运行时间以及当前集合中键数量的信息。

<q></q>

q 命令通知服务器客户端想要断开连接。服务器响应 200.Good bye 消息。

如果向服务器发送了无效命令,服务器将响应 400.Unknown Command 消息。

服务器启动并运行时,我修改了 Memcache PHP 类以连接到服务器,而不是打开一个文件进行读写。结果是一个模拟了 Memcache 客户端库和 Memcached 服务器的解决方案。

下载内容包括 WinMemcached 服务器以及 C# 和 PHP 的演示。

历史

  • 2015 年 2 月 27 日:初始版本
© . All rights reserved.