Pylibmc is a project mainly written in C and PYTHON, based on the BSD-3-Clause license.
Ubuntuized pylibmc
pylibmc
is a Python wrapper around the accompanying C Python extension
_pylibmc
, which is a wrapper around libmemcached
from TangentOrg.
You have to install libmemcached
separately, and have your compiler and
linker find the include files and libraries.
With libmemcached
installed and this package set up, the following basic
usage example should work::
>>> import pylibmc
>>> mc = pylibmc.Client(["127.0.0.1:11211"])
>>> mc.set("foo", "Hello world!")
True
>>> mc.get("foo")
'Hello world!'
The API is pretty much python-memcached
. Some parts of libmemcached
aren't
exposed yet. I think.
There's also support for some other features not present in other Python libraries, for example, the binary protocol::
>>> mc = pylibmc.Client(["127.0.0.1"], binary=True)
That's it, the binary protocol will be used for that instance.
libmemcached
has ways of telling it how to behave. You'll have to refer to
its documentation on what the different behaviors do.
To change behaviors, quite simply::
>>> mc.behaviors["hash"] = "fnv1a_32"
For a list of the defined behavior key names, see what the keys of a client is. For example::
>>> mc.behaviors.keys() # doctest: +NORMALIZE_WHITESPACE
['hash', 'connect timeout', 'cache lookups', 'buffer requests',
'verify key', 'support cas', 'poll timeout', 'no block', 'tcp nodelay',
'distribution', 'sort hosts']
The hash
and distribution
keys are mapped by the Python module to constant
integer values used by libmemcached
. See pylibmc.hashers
and
pylibmc.distributions
.
In multithreaded environments, accessing the same memcached client object is
both unsafe and counter-productive in terms of performance. libmemcached
's
take on this is to introduce pooling on C level, which is correspondingly
mapped to pooling on Python level in pylibmc
::
>>> mc = pylibmc.Client(["127.0.0.1"])
>>> pool = pylibmc.ThreadMappedPool(mc)
>>> # (in a thread...)
>>> with pool.reserve() as mc:
... mc.set("hello", "world")
For more information on pooling, see my two
long posts
about it.
http://lericson.blogg.se/code/2009/september/draft-sept-20-2009.html http://lericson.blogg.se/code/2009/september/pooling-with-pylibmc-pt-2.html
Why use pylibmc
? Because it's fast.
See this (a bit old) speed comparison
, or amix.dk's comparison
.
http://lericson.blogg.se/code/2008/november/pylibmc-051.html http://amix.dk/blog/viewEntry/19471
#sendapatch
on chat.freenode.net
.
get_stats
method, which behaves exactly like
python-memcached
's equivalent.python-memcached
does.libmemcached
return codes.Client.behaviors.update
.pooling.rst
in the distribution.binary=True
to
the constructor and there you go.libmemcached
0.32, but should work with older
versions. Remember to run the tests!amix.dk
, which should make pylibmc work under
Snow Leopard.build/lib.*/_pylibmc.so
if available,
and reports some version information.libmemcached
0.26, WRT error return codes.flush_all
and disconnect_all
methods.libmemcached
0.23._pylibmc
, and added lots of libmemcached
constants
to it, as well as implemented behaviors.