MemcachedClient cas操作未返回已存在

时间:2013-04-11 20:07:00

标签: java memcached

我有以下单元测试使用net.spy.memcached.MemcachedClient

    @Test
public void testCASFailsWrite() throws Exception {
    Integer begin = new Integer(3);
    client.set(key, 0, begin);

    CASValue<Object> casValue = client.gets(key);

    Assert.assertNotNull(casValue);
    Assert.assertTrue(casValue.getValue() instanceof Integer);

    Integer fromCache = (Integer) casValue.getValue();  
    Integer nextSeq = new Integer(fromCache + 9);

    long myInvalidValue = casValue.getCas() - 1;

    CASResponse response = client.cas(key, myInvalidValue, nextSeq);
    Assert.assertEquals(CASResponse.EXISTS, response);
}

我希望CASResponse显示已经存在的值,因为我有一个无效的casValue,但是在最后一个Assert中它返回OK。我想确保我的密钥句柄在多个JVM上同时更新。我的单元测试是通过com.thimbleware.jmemcached.AbstractCache的实现使用嵌入式memcache进程。当我的密钥已经在memcache中并且我没有相同的casValue()时,我可以依赖CASResponse来显示EXISTS吗?

1 个答案:

答案 0 :(得分:0)

这可能是因为您正在对一个全新的memcached实例运行此测试。 cas值在memcached实例中是全局的,第一个集合接收cas值1,第二个集合获得cas值2,依此类推。运行测试时,密钥的cas值为1.由于只是递减此密钥的cas值而生成无效的cas,因此无效的cas值最终为0.在更新中指定cas值为0表示忽略cas,只是更新。将myInvalidValue设置为一些随机数,如123456,这个问题就会消失。另一个有趣的事情是,如果你在两次以上的地方运行你的测试,它将会第二次通过。