killme2008 / xmemcached

High performance, easy to use multithreaded memcached client in java.
http://fnil.net/xmemcached
Apache License 2.0
757 stars 280 forks source link

求教cas操作的行为 #65

Closed welkinbai closed 7 years ago

welkinbai commented 7 years ago

版本是2.0版本 cas操作在更新memcached中 不存在 的key时,行为是怎样的?

目前我自己测试,如果net.rubyeye.xmemcached.XMemcachedClient#cas(java.lang.String, int, java.lang.Object, long)这个方法,第4个写0的话,会插入新的key-value。如果第4个cas这个值写的不是0,就不会插入新key-value。请问这是怎么回事?

我使用telnet直接连接memcached时,试图重现,但是无论cas的值我写的是不是0,对方都会返回NOT_FOUND,而不是在0的时候插入成功。

client行为和命令行直接用telnet行为似乎不一致?是bug还是额外的特性?

killme2008 commented 7 years ago

cas 的值是通过 gets 获取的,而不是自己设置的。

killme2008 commented 7 years ago

https://github.com/killme2008/xmemcached/wiki/Xmemcached%20%E4%B8%AD%E6%96%87%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97#cas%E6%93%8D%E4%BD%9C

welkinbai commented 7 years ago

在原来mamcached里没有值的情况下,通过gets获取,返回的结果是空,所以就设置了个0。此时cas作用和set一样,请问是怎么回事??

welkinbai commented 7 years ago

找到了,看起来是官方提供的特性: https://github.com/memcached/memcached/wiki/BinaryProtocolRevamped#set-add-replace https://stackoverflow.com/questions/7770516/what-should-cas-id-for-initial-set-call/7774270#7774270