iunknown
SPNetKit:http/smtp/pop3/memcached 的客户端库
SPNetKit 主要是一个常见应用层协议的客户端库,使用 C++ 实现,目前实现了 http,smtp,pop3,memcached 。
对于每个客户端都带有一个命令行的示范例子。
http/smtp/pop3 除了 TCP 实现之外,也能支持 SSL (基于 openssl)。
memcached client 支持了最新的 memcached 1.2.4 中新增加的 'append', 'prepend', 'gets', and 'cas' 命令。
主页:[url]http://code.google.com/p/spnetkit/[/url]
下载:[url]http://spnetkit.googlecode.com/files/spnetkit-0.1.1.src.tar.gz[/url]
[[i] 本帖最后由 iunknown 于 2008-1-14 22:45 编辑 [/i]]
queue
目前好像还很少见到使用 c++ 实现的 memcached client ,c 的倒有好几个了。
不过 spnetkit 中的 memcached client 只实现了协议部分,一些高级的功能好像还没有。
比如对于多台 server 的支持方面。目前的实现如果需要支持多台 server ,调用者还需要做一些工作。
如果可以针对常见的使用场景,做一些这方面的封装,那就更方便了。
iunknown
关于 consistent hashing
在 memcached 的官方网站上看了一下,目前关于 memcached client 的一个热点是支持 consistent hashing 这个特性。
现在对这个还不是太了解,要找个时间认真看一下。
iunknown
[quote]原帖由 [i]queue[/i] 于 2008-1-14 22:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7851785&ptid=1041761][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
目前好像还很少见到使用 c++ 实现的 memcached client ,c 的倒有好几个了。
不过 spnetkit 中的 memcached client 只实现了协议部分,一些高级的功能好像还没有。
比如对于多台 server 的支持方面。目前的实 ... [/quote]
[url]http://spnetkit.googlecode.com/files/spnetkit-0.2.0.src.tar.gz[/url]
发布了 0.2.0 版。这个版本主要是实现 memcached client 的多台服务器支持。
目前的实现采用了 consistent hashing 算法。先来看一下配置文件:
[code]
[SocketPool]
ConnectTimeout = 6
SocketTimeout = 6
MaxIdlePerEndPoint = 10
MaxIdleTime = 3600
[EndPointTable]
TableKeyMax = 1000
Server0 = "0-199" 127.0.0.1:11211
Server1 = "200-399" 127.0.0.1:11212
Server2 = "400-599" 127.0.0.1:11213
Server3 = "600-999" 127.0.0.1:11214
[/code]
首先是配置一个 SocketPool 。MemcachedClient 采用非阻塞 socket 方式,因此可以控制连接和数据传输时的超时时间。
MaxIdlePerEndPoint 是针对每台服务器能够保留最多的空闲连接数。
MaxIdleTime 是当从 Pool 中取出一个 Socket 的时候,如果这个 Socket 的空闲时间已经超过了 MaxIdleTime ,那么将废弃不用。
consistent hashing 算法主要体现在 EndPointTable 这个配置节中。
TableKeyMax 设定了一个集合 KeyHashSet 。
在上面的配置中,设定的 KeyHashSet 为 [0-999]
所有的 Server 从这个 KeyHashSet 中,认领一部分。
Server0 认领了 [0-199] ,Server1 认领了 [200-399] ,如此类推。
当需要对一个 key 进行操作的时候,首先对这个 key 做一次 hash 运算得到一个 HashValue 。
通过 HashValue mod TableKeyMax 得到一个在 KeyHashSet 集合内的 KeyHash 值。
然后就可以根据各台 Server 认领的情况,找到对应的 Server 。
只要保证对 key 使用的 hash 算法不变,并且 TableKeyMax 不变,那么对于同一个 Key 就总是得到同一个 KeyHash 值。
当需要对 Server 做部分调整的时候,只影响调整的那部分 Server ,其他的 Server 将不受影响。
比如上面的 Server3 认领的 KeyHash 比其他的 Server 都多,那么将来如果要对 Server3 进行拆分,可以重新做如下的配置:
[code]
[EndPointTable]
TableKeyMax = 1000
Server0 = "0-199" 127.0.0.1:11211
Server1 = "200-399" 127.0.0.1:11212
Server2 = "400-599" 127.0.0.1:11213
Server3 = "600-799" 127.0.0.1:11214
Server4 = "800-999" 127.0.0.1:11215
[/code]
在这这样拆分之后,原来保存在 Server0/Server1/Server2 上的数据都不受影响。
受影响的只是部分原来保存在 Server3 上的数据。
[[i] 本帖最后由 iunknown 于 2008-2-17 16:24 编辑 [/i]]