我开始将 libmemcached 集成到我的应用程序中并阅读文档,有一个非阻塞模式标志。快速google了一下,似乎非阻塞模式有性能优势,但是非阻塞模式运行libmemcached有什么缺点吗?
1 回答
当然有。仅当您需要确保写入的值实际上已写入 memcached 并且没有失败时,才会出现缺点。例如 - 您正在使用 memcached 存储一个计数器变量,该变量具有一个哨兵,用于在执行操作之前检查计数器是否已达到某个值。
在阻塞模式下——memcached 客户端在继续之前将等待从 memcached 获得写入成功响应,如果失败则产生错误。这样您就知道计数器已更新。如果您告诉它以非阻塞模式写入,客户端会发送请求以增加计数器,但不会等待以确保它确实发生了。因为它不等待,所以您可以在调用恢复后更快地执行代码,但不确定计数器是否会增加。
但是,由于 memcached 值在服务重新启动时被破坏(想想系统崩溃),您永远无法真正确定某个值是否存在。此外,通过低内存修剪,您也永远无法确定该值是 100% 正确的,因为它可能会被 LRU 算法修剪——您需要持久存储来缓解这种不确定性。
鉴于这种固有的不确定性,许多人使用非阻塞模式来获得性能提升,因为他们无法完全确定 memcached 中的计数器值不会被重置/不准确,所以为什么不通过权衡获得一些性能。
希望这能澄清问题。作为旁注 - MongoDB 在持久存储中具有非阻塞写入 - 虽然它的灵活性非常棒,但给使用非阻塞模式的人们更多的是一种错误的安全感,即写入总是会成功......
R