c之libmemcached之memcached_mget 似乎阻塞

kevingrace 阅读:12 2024-11-01 17:39:52 评论:0

我有一个内存缓存服务器。我使用 libmemcached C api 与它交互。我正在使用非阻塞模式和无回复模式(行为标志)。

如果有帮助,我还在 nginx C 模块中使用 libmemcached。

问题是 memcached_mget 似乎会阻塞,即对于延迟大约为 40 毫秒的服务器,memcached_mget 需要 40 毫秒才能完成。这不完全是异步的。

这是我使用的代码:

const char* localKeys[2] = {"key1", "key2"}; 
size_t k_length[2] = {4, 4}; 
 
gettimeofday(&t1, NULL); 
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no block: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK)); 
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no reply: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY)); 
retFt = memcached_mget(memc, localKeys, k_length, 2); 
gettimeofday(&t2, NULL); 
 
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0, "memcached_mget duration (microseconds): %d, result : %d", t2.tv_usec - t1.tv_usec, retFt); 
 
retFt = memcached_fetch_execute(memc, fp, &callback_struct, 1); 

我正在使用 ASCII 协议(protocol)。也尝试使用二进制,但没有帮助。 我还尝试了 memcached_mget_execute。 我正在使用 tc 模拟延迟,就像这样:

tc qdisc add dev lo root netem delay 20ms 

请您参考如下方法:

libmemcached 的 API 总是阻塞的。 “非阻塞”模式只是在套接字上设置该标志。如果您使用该标志,libmemcached 会通过调用 poll() 进行自己的阻塞。


标签:Memcached
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号