张宴(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。欢迎大家指点优化一下。