16.2.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 cPicklepickle模块自动序列化(转换为字符串值)。

要创建新memcache接口,请导入memcache模块并创建memcache.Client该类的新实例。例如,如果memcached守护进程使用默认端口在本地主机上运行:

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

第一个参数是一个字符串数组,其中包含要使用的每个memcached实例的服务器和端口号。要启用调试,请将可选 debug参数设置为 1。

默认情况下,用于在多个服务器之间划分项目的哈希机制是crc32. 要更改使用的功能,请将 的值设置为 memcache.serverHashFunction要使用的替代功能。例如:

from zlib import adler32
memcache.serverHashFunction = adler32

一旦定义了要在 memcache实例中使用的服务器,核心函数就会提供与通用接口规范中相同的功能。下表提供了支持的功能的摘要。

函数memcache_ 等效的泛型函数
get() 通用get()的。
get_multi(keys) 从提供的 数组中获取多个值keys。返回键值对的哈希引用。
set() 通用set()的。
set_multi(dict [, expiry [, key_prefix]]) 从提供的 设置多个键值对dict
add() 通用add()的。
replace() 通用replace()的。
prepend(key, value [, expiry]) 将 supplied 添加value到现有key.
append(key, value [, expiry[) 将 supplied 附加value到现有key.
delete() 通用delete()的。
delete_multi(keys [, expiry [, key_prefix]] ) 从散列中删除与数组中每个字符串匹配的所有键 keys
incr() 通用incr()的。
decr() 通用decr()的。
笔记

在 Pythonmemcache模块中,所有 *_multi()函数都支持可选 key_prefix参数。如果提供,则该字符串将用作所有键查找的前缀。例如,如果您调用:

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

该函数从服务器 检索密钥users:a和 。users:b

下面是一个示例,显示了memcache实例的信息存储和检索,从 MySQL 加载原始数据:

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 服务器。

$> python memc_python.py
Updated memcached with MySQL data

因为数据是使用 cPickle/自动序列化的,所以当您从memcachedpickle加载回数据时,您可以直接使用该对象。在上面的示例中,存储的信息采用来自 Python DB 游标的行的形式。访问信息时(在 60 秒到期时间内),数据加载 和转储: memcachedmemcached

$> 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 格式。