【问题标题】:AppEngine Memcache expiration policiesAppEngine Memcache 过期策略
【发布时间】:2014-06-22 02:46:47
【问题描述】:

我期待以下 AppEngine 代码:

MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
memcache.put("Foo", "Bar", Expiration.onDate(new Date(1)));
System.out.println(memcache.get("Foo"));
System.out.println(memcache.put("Foo", "Baz", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));

产生以下输出:

null
true

即通过在将条目放入缓存时将过期日期设置为 1970 年,我希望它会立即被删除并可供重复使用。

相反,我得到:

Bar
false

即条目还在。

现在,奇怪的是,如果我将代码更改为Expiration.onDate(new Date())(没有1),即在执行put操作之前将到期时间设置为正确,我确实得到了预期“空,真”。

Memcache 是否会以某种方式将过去太远的过期日期解释为相对于现在而不是绝对日期?但即使这样也不符合结果,因为从 put 开始的 1ms 在 get 到来时应该已经过期了?!?

我可以将 Expiration 设置为什么值,以保证 put 条目立即到期(并删除!)?请记住,仅使用当前时间戳可能无法可靠地工作,因为 AppEngine 不提供跨服务器的任何时钟同步保证!

我知道乍一看想要这样做听起来很荒谬(为什么不直接删除它?),但我想在这里使用它:AppEngine Memcache atomic get-and-delete(“结论”上方的句子)。

【问题讨论】:

    标签: java google-app-engine memcached cache-expiration


    【解决方案1】:

    哇!这很模糊,但我想通了:

    查看source for the doPut()-method in AsyncMemcacheServiceImpl.java,第 505 行内容如下:

    itemBuilder.setExpirationTime(expires == null ? 0 : expires.getSecondsValue());
    

    Expiration.getSecondsValue() 包含以下行:

    return (int) (getMillisecondsValue() / 1000);
    

    也就是说:过期值为“0”相当于没有过期(同null),过期时间除以1000换算为秒。

    所以,如果我将过期时间设置为 1 毫秒,它会变成 0 秒(除以 1000 时向下舍入),这相当于没有过期时间...... Blah!!!

    所以,答案是:Expiration.onDate(new Date(1000)) 应该立即过期,除非 memcache 服务器仍然生活在 60 年代... :) 试过了。作品。完成...

    (这些测试是在 DevServer 上完成的。我希望生产服务器的行为也一样。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      相关资源
      最近更新 更多