Кэшировать результат запроса базы данных MySQLdb в памяти - PullRequest
3 голосов
/ 05 апреля 2010

Наше приложение выбирает правильный сервер базы данных из пула серверов баз данных. Таким образом, каждый запрос на самом деле представляет собой 2 запроса, и они выглядят так:

  1. Получить правильный сервер БД
  2. Выполнить запрос

Мы делаем это, чтобы при необходимости можно было подключать серверы БД как к сети, так и к сети, а также для распределения нагрузки.

Но первый запрос выглядит так, как будто он может быть кэширован в память, поэтому он фактически запрашивает базу данных каждые 5 или 10 минут или около того.

Какой лучший способ сделать это?

Спасибо.

РЕДАКТИРОВАТЬ это для веб-приложения Pylons

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Просто создайте кеш (python dict), в котором хранится первый запрос, и возвращайте его каждый раз, очищайте кеш каждые N минут, для этого вы создаете декоратор или класс кеша, например

import time

cache = {}
lastTime = time.time()

def timedCacheDecorator(func):

    def wrap(*args, **kwargs):

        key = str(args)+str(kwargs)

        # cache for 5 seconds
        global lastTime
        if key not in cache or time.time() - lastTime > 5:
            lastTime = time.time()
            cache[key] = func(*args, **kwargs)

        return cache[key]

    return wrap


# lets test it

@timedCacheDecorator
def myquery():
    return time.time()

print myquery()
time.sleep(1)
print myquery()
time.sleep(5)
print myquery()
time.sleep(1)
print myquery()

Выход:

1270441034.58
1270441034.58
1270441040.58
1270441040.58

Теперь этот декоратор можно использовать в любой функции, результаты которой должны быть кэшированы до определенного времени или до события. Я бы сделал этот декоратор классом, так что до обновления кэша может потребоваться сколько секунд, а также вы можете увидеть, как лучше всего генерировать ключ.

1 голос
/ 03 мая 2010

Самым простым способом было бы использовать кэш стакана, который является библиотекой, встроенной в каркас пилонов.

В класс вашей модели импортируйте декоратор мензурки:

from pylons.decorators.cache import beaker_cache

Затем в заголовок вашей функции, где вы делаете вызов базы данных, добавьте следующий декоратор:

@beaker_cache(expire = 300, type='memory')

Измените значение срока действия на желаемое количество секунд (в настоящее время установлено 5 минут).

...