Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


16.6.3.5 Python での MySQL と memcached の使用

Python の memcache モジュールは、memcached サーバーへのインタフェースであり、純粋に Python で (つまり、いずれかの C API を使用せずに) 記述されています。Python Memcached からコピーをダウンロードしてインストールできます。

インストールするには、パッケージをダウンロードして、Python インストーラを実行します。

python setup.py install
running install
running bdist_egg
running egg_info
creating python_memcached.egg-info
...
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing python_memcached-1.43-py2.4.egg
creating /usr/lib64/python2.4/site-packages/python_memcached-1.43-py2.4.egg
Extracting python_memcached-1.43-py2.4.egg to /usr/lib64/python2.4/site-packages
Adding python-memcached 1.43 to easy-install.pth file

Installed /usr/lib64/python2.4/site-packages/python_memcached-1.43-py2.4.egg
Processing dependencies for python-memcached==1.43
Finished processing dependencies for python-memcached==1.43

インストールが完了すると、memcache モジュールは memcached サーバーに対するクラスベースのインタフェースを提供します。Python のデータ構造体を memcached の項目として格納すると、それらは Python の cPickle または pickle モジュールを使用して自動的に直列化 (文字列値に変換) されます。

新しい memcache インタフェースを作成するには、memcache モジュールをインポートし、memcache.Client クラスの新しいインスタンスを作成します。たとえば、memcached デーモンが localhost 上でデフォルトポートを使用して実行されている場合:

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

1 つ目の引数は、使用する各 memcached インスタンスのサーバーとポート番号を含む文字列の配列です。デバッグを有効にするには、オプションの debug パラメータを 1 に設定します。

デフォルトでは、項目を複数のサーバー間で分配するために使用されるハッシュ化メカニズムは crc32 です。使用する関数を変更するには、memcache.serverHashFunction の値を、代わりに使用する関数に設定します。例:

from zlib import adler32
memcache.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 を取得します。

MySQL から生データをロードして、memcache インスタンスの情報を格納および取得する例をここに示します。

import sys
import MySQLdb
import memcache

memc = 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.py
Updated memcached with MySQL data

データは cPickle/pickle を使用して自動的に直列化されるため、データを memcached からロードしたときは、そのオブジェクトを直接使用できます。上の例では、memcached に格納された情報が Python DB のカーソルから取得した行の形式になっています。(60 秒の失効時間内に) 情報にアクセスすると、データが memcached からロードされ、ダンプされます。

shell> python memc_python.py
Loaded data from memcached
2, ACE GOLDFINGER
7, AIRPLANE SIERRA
8, AIRPORT POLLOCK
10, ALADDIN CALENDAR
13, ALI FOREVER

直列化と直列化解除は自動的に行われます。Python データの直列化はほかのインタフェースや言語と互換性がない可能性があるため、初期化時に使用される直列化モジュールを変更できます。たとえば、ある言語で記述されたスクリプトを使用して複雑なデータ構造を格納し、別の言語で記述されたスクリプトでそれらにアクセスするときは、JSON フォーマットを使用できます。