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'])
첫 번째 인수는 사용하는 각 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 포맷을 사용할 수 있습니다.