在memcache

时间:2016-05-06 11:47:18

标签: google-app-engine caching memcached

我们的Google AppEngine Java应用程序涉及缓存从服务器请求信息的最近用户。

目前的工作解决方案是我们将用户信息存储在列表中,然后缓存该列表。

当我们需要最近的用户时,我们只需从此列表中抓取一个。

最近用户的列表对我们的应用程序工作并不重要,如果它从缓存中删除,它只是在用户继续从服务器请求时重建。

我想知道的是:我能以更好的方式做到这一点吗?

使用当前的方法,在列表变得大到memcache之前,我们可以存储一定数量的用户(我们当前将列表限制为1000并且在插入新列表时删除最旧的用户)。此外,该列表将需要非常快速地更新,这涉及从memcache检索完整列表只是为了添加单个用户。

让每个用户分别存储在缓存中对我们有益,因为我们要求最近的用户在30分钟后过期。目前,这是一项手动任务,我们确保列表不包含过期用户。

此方案的最佳方法是什么?如果它将用户分别存储在缓存中,那么跟踪用户的最佳方法是什么,以便我们可以检索它?

2 个答案:

答案 0 :(得分:1)

您可以在memcache列表中保留“指针”,您可以使用它来构建单独的memcache密钥以访问单独存储在memcache中的用户实体。这使得列表的memcache大小足迹更小,易于处理。

如果用户实体有父项,则指针必须是它们的键,这些键是唯一的,因此它们也可以用作内存缓存键(如果需要,它们的urlsafe版本)。

但是如果用户实体没有父项(即它们是实体组中的根实体),那么您可以将其数据存储区密钥ID用作指针 - 通常比密钥短。更好的是,如果ID是数字ID,您甚至可以将它们存储为数字,而不是字符串。这些实体的ID是唯一的,但它们可能不够独特,无法用作内存缓存密钥,您可能需要添加前缀/后缀以使相应的内存缓存密钥唯一(对您的应用程序而言)。

当您需要用户实体数据时,首先从列表中获取“指针”,构建用户实体内存缓存密钥并使用该密钥检索实体。

当然,这假设您确实有理由保留该列表。如果列表本身不是强制性的,那么您只需要为每个实体获取(唯一)memcache密钥的方法。

答案 1 :(得分:0)

如果您使用NDB caching,它将为您处理内存缓存。只需使用ndb.Key(Model, id).get()Model.get_by_id(id)向用户提出密钥,其中id是用户ID。