java - MemcachedClient cas 操作未返回已存在

标签 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,但是在最后一个断言中它返回为 OK。我想确保我的 key 能够在多个 JVM 上同时更新。我的单元测试是通过 com.thimbleware.jmemcached.AbstractCache 的实现使用嵌入式 memcache 进程。当我的 key 已经在内存缓存中并且我没有相同的 casValue() 时,我可以依靠 CASResponse 显示 EXISTS 吗?

最佳答案

这可能是因为您正在针对全新的 memcached 实例运行此测试。 cas 值在 memcached 实例中是全局的,第一组接收 cas 值 1,第二组接收 cas 值 2,依此类推。当您运行测试时,您的 key 的 cas 值为 1。由于您的无效 cas 是通过递减该 key 的 cas 值生成的,因此您的无效 cas 值最终为 0。在更新中指定 cas 值 0 意味着忽略cas 并更新。将 myInvalidValue 设置为一些随机数,例如 123456,这个问题就会消失。另一个有趣的事情是,如果您在哪里运行测试两次以上,第二次就会通过。

关于java - MemcachedClient cas 操作未返回已存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957901/

相关文章:

java - 在 Main 中调用字符串方法

java - 更改 GUI 窗口大小

java - 使用 Java、Spring 进行基于配置文件的可切换 JSON 压缩

java - 在java中使用memcached

rest - 在面向服务的架构中缓存

java - 如何在 JPA 中保留 List<String> 类型的属性?

java - 我如何启用/禁用 Android 上的以太网连接?

python - 如何更新存储在 Django 缓存中的字典?

caching - Memcached 依赖项

Java Memcached 不跨实例复制条目