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 フォーマットを使用できます。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
Sign Up Login You must be logged in to post a comment.