对httpsqs的改造(支持二进制数据)
张宴(http://blog.s135.com) 开发了httpsqs(http://blog.s135.com/httpsqs_1_3/) , 简单方便高效,但是不直接支持二进制,如
<pre lang=”bash”>
curl http://host:port/?name=xxx&opt=put&data=a%00b
</pre>
花了点时间画蛇添足,将httpsqs改为支持二进制了。
代码下载地址: http://dl.dbank.com/c0aliuis2m
实现原理
httpsqs的存储是利用了tcbdb, 在原作者的实现中,存储的数据为queue_name:pos => data
我在data之前加了4个字节,即:修改之后的data结构为:
01 00 0A 3C xx xx xx
其中:
- 第一个字节为固定的01,为格式的版本标识,主要是以后为了区分不同版本的二进制而准备,目前可以忽略
- 后面三个字节表示长度, 表示真正的数据区的size
- 最后面的就是真正的数据了
存储时,比较简单,直接从参数中解析到数据,读取长度,然后拼装为需要的格式,put到tcbdb中
读取时,从tcbdb中拿到数据,读取前4个字节,解析出长度,然后读取对应长度的数据返回
疑问
Q:为什么不让客户端自己base64之后再存入httpsqs
A:base64之后,可能会导致存储的数据变大,造成浪费,而且增加客户端不必要的执行时间。
Q:核心就是拿到长度,那为什么不直接增加一个 queue_name:pos ==> size ,这样实现更简单,更容易理解
A:为了以后的扩展,增加其它的更多功能
Q: 代码改得太糟糕了
A: 没办法,印象中毕业之后就没写过C。欢迎大家指点优化一下。
原创文章如转载,请注明:转载自CODIGG [ http://www.codigg.com/ ]
本文链接地址:http://www.codigg.com/2010/11/httpsqs-binary-data-support/


踏雪留痕,你也评论一下吧