【问题标题】:Memcache getItemCount() counting expired keys?Memcache getItemCount() 计算过期键?
【发布时间】:2012-07-02 14:53:34
【问题描述】:

我想在任何给定时间获取“活动”键的计数。现在根据 API 文档 getItemCount() 意味着返回这个。

然而事实并非如此。过期键不会减少 getItemCount() 的值。为什么是这样?如何准确计算所有未过期的“活动”或“活动”密钥?

这是我的放置代码; syncCache.put(uid, cachedUID, Expiration.byDeltaSeconds(3), SetPolicy.SET_ALWAYS);

现在密钥应该在 3 秒后过期。它会使它们过期,但 getItemCount() 不反映键的真实计数。

更新: 看来 memcache 可能不是我应该使用的,所以这就是我想要做的。

我希望编写一个 google-app 引擎服务器/应用程序,作为桌面应用程序的“用户在线”功能。桌面应用程序使用唯一 ID 作为参数向应用程序发出 http 请求。应用程序将此 UID 与时间戳一起存储。每 3 分钟执行一次。

每 5 分钟删除一次时间戳超出 5 分钟窗口的任何条目。然后你计算你有多少条目,这就是有多少用户“在线”。

过期功能看起来很完美,因为那时我什至不需要担心时间戳或清除过期条目。

【问题讨论】:

  • 在将项目放入缓存之前和之后立即显示什么?是否确定添加了该项目?
  • getItemCount 增量很好,并在创建新密钥时正确显示。但是,如果我理解正确,它应该在密钥过期时递减?

标签: java google-app-engine memcached


【解决方案1】:

这可能是文档中的一个问题,python 没有提到任何关于活着的。这在 python 中也可以重现。

另请参阅此相关帖子How does the lazy expiration mechanism in memcached operate?

【讨论】:

  • 您链接的相关帖子表明我担心的是,过期的密钥实际上并没有被销毁。这一点都不好。有什么方法可以在任何给定时间确定我有多少活着的钥匙?
  • 过期的密钥被销毁,但仅在需要时。例如,如果您尝试访问过期元素,那么它将被删除。此外,如果 memcache 需要更多内存来存储新密钥,它会首先删除过期的密钥。如果您向我们展示您想要实现的目标,也许会更好。
  • 我刚刚更新了原始帖子以包含我想要完成的内容。我开始认为 memcache 可能不是解决方案。
【解决方案2】:

getItemCount() 可能会返回过期的键,因为它是 memcache 和许多其他缓存的工作方式。

Memcache 可以帮助您做您描述的事情,但不是您尝试做的方式。考虑完全相反的情况:您将在线用户放在 memcache 中,然后 appengine 由于缺少可用内存而将其从 memcache 中清除。缓存不会为您提供任何保证您的项目将在任何特定时期存储。因此,memcache 可以让您减少对数据存储的请求数量和延迟。

其中一种方法: 维护存储在数据存储中(或者如果您不需要非常精确,则存储在 memcache 中)的排序映射(用户 ID、上次登录刷新)条目。在每次登录/刷新时,您都会通过特定键更新值,并从定期 cron-job 中从地图中删除旧用户。所以地图的大小将是特定时刻的登录使用数。

确保地图适合 1 Mb,这是内存缓存或数据存储的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-09-04
    相关资源
    最近更新 更多