Google App Engine + Memcache, как получить все данные из кэша - PullRequest
1 голос
/ 17 февраля 2011

Внутри моей системы у меня есть данные с коротким сроком службы, это означает, что данные все еще неактивны в течение длительного времени, но должны сохраняться в хранилище данных.Также эти данные могут часто изменяться для каждого пользователя, например, каждую минуту.Потенциально количество пользователей может быть достаточно большим, и я хочу ускорить процесс ввода / получения этих данных с помощью memcache и отложенного сохранения в bigtable.

Нет проблем, просто поставить / получить объекты по ключам.Но для некоторых случаев использования мне нужно извлечь все данные из кеша, который еще жив, но API позволяет мне получать данные только по ключам.Следовательно, мне нужен некоторый держатель ключей, который знает все ключи данных внутри memcache ... Но любой объект может быть удален, и мне нужно удалить этот ключ из глобального реестра ключей (но такой слушатель не работает в GAE).Чтобы сохранить все эти объекты в списке, карта не подходит для моего решения, потому что каждый объект должен иметь свое время для выселения ...

Может ли кто-нибудь порекомендовать мне, каким образом я должен двигаться?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2011

Похоже, что вы действительно пытаетесь сделать, это иметь какую-то очередь для данных, которые вы будете сохранять. Memcache не является хорошим выбором для этого, поскольку, как вы сказали, он ненадежен (и не должен быть). Возможно, вам лучше использовать Task Queues ?

0 голосов
/ 22 июня 2012

Поскольку я сталкиваюсь с той же самой проблемой, которую я мог бы решить, построив функцию декоратора и обернув вокруг нее функцию выселения, чтобы ключ к сущности автоматически удалялся из каталога ключей / заполнителей в 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

Вы можете улучшить это в соответствии со своей структурой данных и потоком.И для получения дополнительной информации о декораторах.

Возможно, вы захотите добавить cron , чтобы поддерживать синхронизацию вашего хранилища данных с memcache через регулярные промежутки времени.

0 голосов
/ 18 февраля 2011

Memcache не предназначен для исчерпывающего доступа, и если он вам нужен, вы, вероятно, используете его неправильно. Memcache - это хеш-таблица с осколками, и поэтому она не предназначена для перечисления.

Из вашего описания неясно, что именно вы пытаетесь сделать, но, по крайней мере, вам нужно реструктурировать свои данные, чтобы вы знали об ожидаемых ключах в тот момент, когда вы хотите записать их в хранилищу.

...