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






4.89/5 (4投票s)
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
的类,并实现一些常用的方法,如 connect
、add
、set
、get
和 flush
。
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
元素和两个子元素 k
、v
。a
命令告诉服务器存储键为 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
客户端库和 Memcache
d 服务器的解决方案。
下载内容包括 WinMemcached
服务器以及 C# 和 PHP 的演示。
历史
- 2015 年 2 月 27 日:初始版本