Memcache getItemCount()计算过期密钥?

时间:2012-07-02 14:53:35

标签: java google-app-engine memcached

我想得到"活着"在任何给定时间的钥匙。现在根据API文档,getItemCount()意味着返回它。

但事实并非如此。过期的密钥不会减少getItemCount()的值。为什么是这样?如何准确计算所有"活跃"或者"活着"没有过期的钥匙?

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

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

更新: 似乎memcache可能不是我应该使用的,所以这就是我想要做的事情。

我希望编写一个google-app引擎服务器/应用程序,作为"在线用户"桌面应用程序的功能。桌面应用程序向应用程序发出http请求,并以唯一ID作为参数。该应用程序存储此UID以及时间戳。这是每3分钟完成一次。

每隔5分钟删除任何时间戳超出该5分钟窗口的条目。然后你计算你有多少条目,以及有多少用户是"在线"。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

Memcache可以帮助您按照您的描述进行操作,但不能按照您尝试的方式进行操作。考虑完全相反的情况:你将在线用户放在memcache中,然后由于缺少可用内存而将其从memcache中擦除。缓存不会保证您在任何特定时期内存储的项目。因此,memcache可以让您减少对数据存储区的请求数和延迟。

其中一种方法: 维护存储在数据存储区中的有序映射(user-id,last-login-refreshed)条目(如果不需要它,则在memcache中非常精确)。在每次登录/刷新时,您都会按特定键更新值,并从定期的cron-job中删除地图中的旧用户。因此,地图的大小将是特定时刻登录使用的数量。

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