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守护进程使用默认端口在本地主机上运行:
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 秒到期时间内),数据加载
和转储:
memcached
memcached
$> 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 格式。