Spec-Zone .ru
спецификации, руководства, описания, API

15.6.3.5. Используя MySQL и memcached с Python

Python memcache модуль взаимодействует через интерфейс к memcached серверам, и пишется в чистом Python (то есть, не используя один из API C). Можно загрузить и установить копию с Python Memcached.

Чтобы установить, загрузите пакет и затем выполните установщик Python:

python setup.py installrunning installrunning bdist_eggrunning egg_infocreating python_memcached.egg-info...removing 'build/bdist.linux-x86_64/egg' (and everything under it)Processing python_memcached-1.43-py2.4.eggcreating /usr/lib64/python2.4/site-packages/python_memcached-1.43-py2.4.eggExtracting python_memcached-1.43-py2.4.egg to /usr/lib64/python2.4/site-packagesAdding python-memcached 1.43 to easy-install.pth fileInstalled /usr/lib64/python2.4/site-packages/python_memcached-1.43-py2.4.eggProcessing dependencies for python-memcached==1.43Finished processing dependencies for python-memcached==1.43

После того, как установленный, memcache модуль обеспечивает class на основе интерфейс для Ваших memcached серверов. То, когда Вы храните структуры данных Python как memcached элементы, они автоматически сериализируются (превратилось в строковые значения), использование Python cPickle или pickle модули.

Создать новое memcache интерфейс, импортируйте memcache модуль и создает новый экземпляр memcache.Client class. Например, если memcached демон работает на localhost использование порта значения по умолчанию:

import memcachememc = memcache.Client(['127.0.0.1:11211'])

Первым параметром является массив строк, содержащих сервер и номер порта для каждого memcached экземпляра, чтобы использовать. Чтобы позволить отладить, установите дополнительное debug параметр к 1.

По умолчанию хеширующий механизм, используемый, чтобы разделить элементы среди многократных серверов, crc32. Чтобы изменить используемую функцию, установите значение memcache.serverHashFunction к альтернативной функции, чтобы использовать. Например:

from zlib import adler32memcache.serverHashFunction = adler32

Как только Вы определили серверы, чтобы использовать в пределах memcache экземпляр, базовые функции обеспечивают ту же самую функциональность как в универсальной спецификации интерфейса. Следующая таблица обеспечивает сводку поддерживаемых функций:

Python memcache Функция Эквивалентная Родовая функция
get() Универсальный get().
get_multi(keys) Получает многократные значения от предоставленного массива keys. Возвращает ссылку хеша пар ключ/значение.
set() Универсальный set().
set_multi(dict [, expiry [, key_prefix]]) Наборы многократные пары ключ/значение от предоставленного dict.
add() Универсальный add().
replace() Универсальный replace().
prepend(key, value [, expiry]) Предварительно ожидает предоставленный value к значению существующего key.
append(key, value [, expiry[) Добавляет предоставленный value к значению существующего key.
delete() Универсальный delete().
delete_multi(keys [, expiry [, key_prefix]] ) Удаляет все ключи из хеша, соответствующего каждую строку в массивеkeys.
incr() Универсальный incr().
decr() Универсальный decr().
Отметить

В пределах Python memcache модуль, весь *_multi()функции поддерживают дополнительное key_prefix параметр. Если предоставлено, то строка используется в качестве префикса ко всем ключевым поискам. Например, если Вы вызываете:

memc.get_multi(['a','b'], key_prefix='users:')

Функция получает ключи users:a и users:b от серверов.

Вот пример, показывая хранение и извлечение информации к a memcache экземпляр, загружая необработанные данные из MySQL:

import sysimport MySQLdbimport memcachememc = memcache.Client(['127.0.0.1:11211'], debug=1);try:    conn = MySQLdb.connect (host = "localhost",                            user = "sakila",                            passwd = "password",                            db = "sakila")except MySQLdb.Error, e:     print "Error %d: %s" % (e.args[0], e.args[1])     sys.exit (1)popularfilms = memc.get('top5films')if not popularfilms:    cursor = conn.cursor()    cursor.execute('select film_id,title from film order by rental_rate desc limit 5')    rows = cursor.fetchall()    memc.set('top5films',rows,60)    print "Updated memcached with MySQL data"else:    print "Loaded data from memcached"    for row in popularfilms:        print "%s, %s" % (row[0], row[1])

Когда выполняющийся впервые, данные загружаются из базы данных MySQL и хранятся к memcached серверу.

shell> python memc_python.pyUpdated memcached with MySQL data

Поскольку данные автоматически сериализируются, используя cPickle/pickle, когда Вы загружаете данные назад из memcached, можно использовать объект непосредственно. В примере выше, информация, хранившая к memcached находится в форме строк от курсора DB Python. Получая доступ к информации (в пределах 60 вторых раз истечения), данные загружаются из memcached и выведенный:

shell> python memc_python.pyLoaded data from memcached2, ACE GOLDFINGER7, AIRPLANE SIERRA8, AIRPORT POLLOCK10, ALADDIN CALENDAR13, ALI FOREVER

Сериализация и десериализация происходят автоматически. Поскольку сериализация данных Python может быть несовместимой с другими интерфейсами и языками, можно изменить модуль сериализации, используемый во время инициализации. Например, Вы могли бы использовать формат ДЖСОНА, когда Вы храните сложные структуры данных, используя сценарий, записанный на одном языке, и получаете доступ к ним в сценарии, записанном на различном языке.