memcache item

     最近一直在捣腾memcached的优化问题,由于我们的memcached上的比较匆忙,导致实际中只有67%的命中率,实在不理想,用memcached-tool工具查看,有几个slabs居然还没有满,但是最近我们放数据进去时过一会就get misses了。显然,这个问题是由于我们之前上memcached的时候没有预先评估存入的items的长度,启动服务器时没有有效调整slabs的增长因子导致的。于是,首先,我就决定看下memcachd服务断源码,看看服务器端是怎么算这个items的长度的。下面是主要的源代码(Version1.3.X):

 static size_t item_make_header(const uint8_t nkey, const int flags, const int nbytes, 00081 char *suffix, uint8_t *nsuffix)

{

     *nsuffix = (uint8_t ) snprintf(suffix, 40, " %d %d\r\n" , flags, nbytes - 2);

      return sizeof (item ) + nkey + *nsuffix + nbytes;

}

其中nkey表示items的键长,*nsuffix表示items的后缀长度,nbytes表示items中value的长度,至于size(item)这个的长度在32位机中为32,在64位机中为48。实际使用中由于每个键值的后面要加上'\0'作为结尾,value后面要加上'\r\n'结尾,那么最后的结果要加上3个字节。下面举出一些具体的测试列子(java 客户端,键值统一为:"DM_20100419"):

(1)、byte=1。set DM_20100419 1 0 1。按照上面的规则计算公式为32+(11+1)+6+(1+2)=53。

(2)、创建一个对象(一定要实现序列化接口),set DM_20100419 8 0 43。同样,按照上面的规则得到计算结果为:32+(11+1)+7+(43+2)=96.

(3)、double=1。 set DM_20100419 512 0 8。按照规则计算32+(11+1)+8+(8+2)=62.

    经过服务器端验证均与上述计算结果吻合。谨以此与大家分享,希望能够给大家一点帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值