在我的系统中,我的数据寿命很短,这意味着数据仍然不会持续很长时间,但数据存储中会持续存在。 此外,每个用户可以频繁更改此数据,例如每分钟。 可能数量的用户可能足够大,我想通过使用memcache来加速这些数据的put / get过程并延迟持续到bigtable。
按键放置/获取对象没问题。但是对于某些用例,我需要从仍然存活的缓存中检索所有数据,但是api允许我仅通过密钥获取数据。因此,我需要一些密钥持有者知道memcache中的所有数据密钥......但任何对象都可能被驱逐,我需要从全局密钥注册表中删除此密钥(但这样的监听器在GAE中不起作用)。要将所有这些对象存储在列表中,地图不适合我的解决方案,因为每个对象应该有自己的时间来驱逐......
有人可以推荐我以哪种方式移动?
答案 0 :(得分:2)
听起来你真正想要做的就是拥有一些你将坚持的数据队列。 Memcache不是一个很好的选择,因为正如你所说,它不可靠(也不是意味着)。也许你最好使用Task Queues?
答案 1 :(得分:0)
Memcache不是为穷举访问而设计的,如果你需要它,你可能会以错误的方式使用它。 Memcache是一个分片哈希表,因此实际上并不是为了枚举而设计的。
从您的描述中并不清楚您正在尝试做什么,但听起来至少您需要重新构建数据,以便在您想要将其写入时,您知道所需的键。数据存储。
答案 2 :(得分:0)
因为我遇到了同样的问题,我可以通过构建一个装饰器函数并将驱逐函数包裹起来来解决这个问题,以便实体的密钥自动从memcache上的密钥目录/占位符中删除,即当你打电话给驱逐。
这样的事情:
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以使您的数据存储定期与内存缓存同步。