4

关于安全处理并发 Memcache 更新的 Google Apps Engine 文档:

Memcache 服务的 putIfUntouched 和 getIdentifiable 方法可用于在需要以原子方式更新同一个 memcache 键的同时处理多个请求的情况下,提供一种安全地对 memcache 进行键值更新的方法。(在这些情况下可能会出现竞争条件。)

我正在构建一个需要准确缓存值的应用程序,下面是我的代码,请帮我检查它是否正确:

        ...
        IdentifiableValue oldCountIdValue = mc.getIdentifiable( cacheKey );
        Long count = ( Long ) oldCountIdValue.getValue();
        if( count != null )
        {
            this.oldCountValue = oldCountIdValue;
            return count;
        }

        Long result = new Long( q.count() );
        mc.putIfUntouched( cacheKey, oldCountValue, result );
        return result;

我的问题是:如果 putIfuntouched() 返回 false 怎么办?代码应该返回什么?如何?

当数据存储添加一个实体时,我使用以下内容:

mc.increment( cacheKey, 1, initValue );

这种用法正确吗?

非常感谢。

4

1 回答 1

1

我需要了解您的代码:
首先,您为什么要检查 count != null?oldCountIdValue == null 不意味着 count == null 反之亦然: if oldCountIdValue != null then count != null

如果是这样,那么代码应该是:

IdentifiableValue oldCountIdValue = mc.getIdentifiable( cacheKey );
if (oldCountIdValue != null) {
   return ( Long ) oldCountIdValue.getValue();
}

Long result = new Long( q.count() );
mc.putIfUntouched( cacheKey, oldCountValue, result );
return result;

如果 putIfUntouched 返回 null,这意味着您的结果变量不再准确,您可以执行以下操作:忽略并返回您当前的结果或从缓存中加载结果。

于 2012-05-08T16:03:11.247 回答