2012-07-02 39 views
1

我想在任何给定的时间获得“活”密钥的数量。现在根据API文档getItemCount()是为了返回这个。Memcache getItemCount()计算过期的密钥?

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

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

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

更新: 看来memcache可能不是我应该使用的,所以这里是我正在尝试做的。

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

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

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

+0

getItemCount在将项目放入缓存之前立即显示什么?该项目是否肯定被添加? –

+0

getItemCount增量很好,并且在创建新密钥时正确显示。但是,如果我理解正确,密钥过期时它应该递减? – JasonF

回答

0

这可能是一个在文档中的问题,蟒蛇没有提及任何关于活着的东西。这在Python中也是可重现的。

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

+0

您链接的相关帖子表明我担心的是,过期的密钥实际上并未被销毁。 这并不好。在任何时候,我可以确定有多少活着的钥匙? – JasonF

+0

已过期的密钥已销毁,但仅在需要时才销毁。例如,如果您尝试访问过期的元素,则会将其删除。另外,如果memcache需要更多内存来存储新密钥,它将首先删除已过期的密钥。如果你向我们介绍你想达到什么,也许会更好。 –

+0

我刚刚更新了原始文章,以包括我想要完成的内容。我开始认为memcache可能不是解决方案。 – JasonF

0

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

Memcache可以帮助您完成您所描述的内容,但不会像您尝试这样做。考虑完全相反的情况:您将在线用户放入memcache中,然后由于缺少可用内存,appengine会将其从memcache中清除。缓存不会给你任何担保,你的物品将被存储在任何特定的时期。因此memcache可以让您减少对数据存储和延迟的请求数量。

其中一个方法来做到这一点: 维护有序映射(用户ID,最后登录,刷新),其存储在数据存储的条目(或内存缓存中,如果你不需要它非常精确)。在每次登录/刷新时,都会根据特定密钥更新值以及定期执行cron-job将旧用户从地图中删除。因此,地图的大小将是在特定时刻登录使用的数量。

确保地图适合1Mb,这对于memcache或数据存储都是有限制的。