This repository has been archived on 2018-06-04. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
Go to file
lericson 3dd7ad5fb6 Update cmemcache test to work with newer memcacheds. 2009-12-30 14:31:31 +01:00
.gitignore Initial import into git! 2009-07-27 16:10:43 +02:00
LICENSE Initial import into git! 2009-07-27 16:10:43 +02:00
MANIFEST.in Add missing ``pylibmc-versio.h`` to manifest. 2009-09-21 22:46:36 +02:00
README.rst Streamline README documentation. 2009-12-30 14:26:27 +01:00
TODO Note UDP/binary in todo. 2009-09-21 15:41:09 +02:00
_pylibmcmodule.c Make delete_multi return value compatible with python-memcached. 2009-12-13 21:00:39 +01:00
_pylibmcmodule.h Clean up behaviors and their names. 2009-12-30 13:54:25 +01:00
pooling.rst Add some URL references. 2009-09-21 15:54:21 +02:00
pylibmc-version.h Prepare 1.0 alpha release. 2009-12-30 13:54:31 +01:00
pylibmc.py Clean up behaviors and their names. 2009-12-30 13:54:25 +01:00
setup.py Update short description. 2009-12-30 14:28:32 +01:00
tests.py Update cmemcache test to work with newer memcacheds. 2009-12-30 14:31:31 +01:00

README.rst

`pylibmc` is a quick and small Python client for memcached__ written in C.

__ http://memcached.org/

It builds on the famous `libmemcached`__ C client from TangetOrg__, notable for
its speed and flexibility.

__ http://tangent.org/552/libmemcached.html
__ http://tangent.org/

`libmemcached` must be installed separately, and be available to the compiler
and linker.

Basic usage is that of `python-memcached`__, like so::

    >>> import pylibmc
    >>> mc = pylibmc.Client(["127.0.0.1:11211"])
    >>> mc.set("foo", "Hello world!")
    True
    >>> mc.get("foo")
    'Hello world!'

__ http://www.tummy.com/Community/software/python-memcached/

There's also support for some other features not present in other Python
libraries, like the binary protocol::

    >>> mc = pylibmc.Client(["127.0.0.1"], binary=True)

Behaviors
=========

`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``.

Pooling
=======

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

Comparison to other libraries
=============================

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

IRC
===

``#sendapatch`` on ``chat.freenode.net``.

Change Log
==========

New in version 0.9
------------------

 - Added a ``get_stats`` method, which behaves exactly like
   `python-memcached`'s equivalent.
 - Gives the empty string for empty memcached values like `python-memcached`
   does.
 - Added exceptions for most `libmemcached` return codes.
 - Fixed an issue with ``Client.behaviors.update``.

New in version 0.8
------------------

 - Pooling helpers are now available. See ``pooling.rst`` in the distribution.
 - The binary protocol is now properly exposed, simply pass ``binary=True`` to
   the constructor and there you go.
 - Call signatures now match `libmemcached` 0.32, but should work with older
   versions. Remember to run the tests!

New in version 0.7
------------------

 - Restructured some of the code, which should yield better performance (if not
   for that, it reads better.)
 - Fixed some memory leaks.
 - Integrated changes from `amix.dk`, which should make pylibmc work under
   Snow Leopard.
 - Add support for the boolean datatype.
 - Improved test-runner -- now tests ``build/lib.*/_pylibmc.so`` if available,
   and reports some version information.
 - Support for x86_64 should now work completely.
 - Builds with Python 2.4, tests run fine, but not officially supported.
 - Fixed critical bugs in behavior manipulation.

New in version 0.6
------------------

 - Added compatibility with `libmemcached` 0.26, WRT error return codes.
 - Added `flush_all` and `disconnect_all` methods.
 - Now using the latest pickling protocol.

New in version 0.5
------------------

 - Fixed lots of memory leaks, and added support for `libmemcached` 0.23.
 - Also made the code tighter in terms of compiler pedantics.

New in version 0.4
------------------

 - Renamed the C module to `_pylibmc`, and added lots of `libmemcached` constants
   to it, as well as implemented behaviors.