您好,欢迎访问一九零五行业门户网

memcached save 数据的一些疑问

众所周知,memcached保存的时候可以这样写:
$memcached->save(a, array(abc,bacd), memcache_compressed, 0);

以及:
$memcached->save(a, json_encode(array(abc,bacd)), memcache_compressed, 0);

但,问题就来了,经过1w调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。
可是memcache的底层save的时候,如果传递的$value为array()那么采用serialize进行序列化。
可是,jsonencode和serialize的性能差异非常大,jsonencode明显会要比serialize要快许多。
求问,memcached最终传递什么值为好?array?还是string?
回复内容: 众所周知,memcached保存的时候可以这样写:
$memcached->save(a, array(abc,bacd), memcache_compressed, 0);

以及:
$memcached->save(a, json_encode(array(abc,bacd)), memcache_compressed, 0);

但,问题就来了,经过1w调数据测试,若 $data =array();中包含中文汉字 通过 json_encode 存入memcached后,明显要比直接存入array的速度要慢很多很多。
可是memcache的底层save的时候,如果传递的$value为array()那么采用serialize进行序列化。
可是,jsonencode和serialize的性能差异非常大,jsonencode明显会要比serialize要快许多。
求问,memcached最终传递什么值为好?array?还是string?
json_encode明显要比serialize快很多?r u sure?
0; $i--) serialize($str);printf(serialize: in %f seconds\n, microtime_float() - $time_start);$time_start = microtime_float();for ($i = 2000000; $i > 0; $i--) json_encode($str);printf(json_encode: in %f seconds\n, microtime_float() - $time_start);
run:
serialize: in 0.928114 seconds
json_encode: in 4.315019 seconds
发现了上面的结论,下面可以直接被忽略了,仅供参考。
@icode的说法可能是一部分的原因;更重要的是,无论是serialize还是json_encode,肯定都是o(n)的,只是serialize的常数可能比json_encode大;然而,由于serialize是在memcache内部调用的,是直接了当地转换,存到sendbuf里,所以可以省掉相当的转换开销:
//memcache_binary_protocol.c +416status = mmc_pack_value(pool, &(request->sendbuf), value, &flags tsrmls_cc);=> default: php_var_serialize(&(buffer->value), &value_copy_ptr, &value_hash tsrmls_cc); ...; mmc_compress(pool, buffer, buffer->value.c + prev_len, buffer->value.len - prev_len, flags, 1 tsrmls_cc);
而json_encode则不然:必须先分配一块空间,存进去,生成一个对应的zval对象,扔回php,再由php交给memcache,然后:
//memcache_binary_protocol.c +416status = mmc_pack_value(pool, &(request->sendbuf), value, &flags tsrmls_cc);=> case is_string: *flags |= mmc_type_string; mmc_compress(pool, buffer, z_strval_p(value), z_strlen_p(value), flags, 0 tsrmls_cc);
可以想象,在这样一个过程中,使用json_encode的开销显著增加了。所以它比直接serialize更差是可以理解的。
至于到底该用哪个,说真的,php本来性能就差得很,不用特别在意这个地方,它往往不太可能会是性能的瓶颈。如果真的觉得到了性能优化要抠这里的时候(估计你更可能会选择用其他语言重写,例如python)(或者恭喜你,可以去找投资人了),方法很多,再不济至少你可以直接修改memcache的源码,把php_var_serialize改成json_encode。
越长存起来就越慢的道理你是懂的吧 ..?
其它类似信息

推荐信息