【问题标题】:Google App Engine + Memcache how to get all data from cacheGoogle App Engine + Memcache 如何从缓存中获取所有数据
【发布时间】:2011-02-17 17:12:55
【问题描述】:

在我的系统中,我有寿命很短的数据,这意味着数据实际上仍然不会很长时间,但应该保留在数据存储中。 此外,该数据可能会为每个用户频繁更改,例如每分钟更改一次。 潜在的用户数量可能足够大,我想通过使用 memcache 来加快这些数据的 put/get 过程,并延迟持久化到 bigtable。

通过按键放置/获取对象没有问题。但是对于某些用例,我需要从缓存中检索仍然存在的所有数据,但 api 允许我仅通过键获取数据。因此,我需要一些知道 memcache 中数据的所有键的密钥持有者......但是任何对象都可能被驱逐,我需要从全局键注册表中删除这个键(但这样的监听器在 GAE 中不起作用)。要将所有这些对象存储在列表中,地图不适用于我的解决方案,因为每个对象都应该有自己的时间来驱逐......

有人可以推荐我应该以哪种方式移动吗?

【问题讨论】:

    标签: java google-app-engine memcached


    【解决方案1】:

    听起来您真正想要做的是为您将要持久化的数据设置某种队列。 Memcache 不是一个好的选择,因为正如您所说,它不可靠(也不应该如此)。也许你最好使用Task Queues

    【讨论】:

    • 不,这完全不同,我也将任务队列用于其他目的,我需要完全缓存。
    【解决方案2】:

    Memcache 并非专为详尽访问而设计,如果您需要它,您很可能以错误的方式使用它。 Memcache 是一个分片哈希表,因此确实不是为枚举而设计的。

    从您的描述中不清楚您到底要做什么,但听起来至少您需要重组数据,以便在您想要将其写入时知道预期的键数据存储。

    【讨论】:

      【解决方案3】:

      因为我遇到了同样的问题,我可以通过构建一个装饰器函数并将驱逐函数包装在它周围来解决这个问题,以便实体的密钥自动从内存缓存上的密钥目录/占位符中删除,即当你调用驱逐。

      类似这样的:

      def decorate_evict_decorator(key_prefix):
      
          def evict_decorator(evict):         
              def wrapper(self,entity_name_or_id):#use self if the function is bound to a class.
                  mem=memcache.Client()
                  placeholder=mem.get("placeholder")#could use gets with cas
                  #{"placeholder":{key_prefix+"|"+entity_name:key_or_id}}
                  evict(self,entity_name_or_id)
                  del placeholder[key_prefix+"|"+entity_name]
                  mem.set("placeholder",placeholder)
              return wrapper
          return evict_decorator
      
      
      class car(db.Model):
          car_model=db.StringProperty(required=True)
          company=db.StringProperty(required=True)
          color=db.StringProperty(required=True)
          engine=db.StringProperty()
      
          @classmethod
          @decorate_evict_decorator("car")
          evict(car_model):
              #delete process
      
      class engine(db.Model):
          model=db.StringProperty(required=True)
          cylinders=db.IntegerProperty(required=True)
          litres=db.FloatProperty(required=True)
          manufacturer=db.StringProperty(required=True)
      
          @classmethod
          @decorate_evict_decorator("engine")
          evict(engine_model):
              #delete process
      

      您可以根据您的数据结构和流程对此进行改进。还有for more on decorators.

      您可能想要添加一个cron 以使您的数据存储定期与内存缓存保持同步。

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2010-11-03
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多