Python cache interface with object-property interface.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Cache object

Cache object is general purpose object-property interface.

NOTE: This library is under rebooting. Do not update from under 0.6.x if you mind continuous rewriting.


There is some pre-defined common types.

in-memory, memcache and redis backends are included. And its common general interfaces too.

>>> from cacheobj.redis import LocalRedisObject
>>> class UserCache(LocalRedisObject):
...   _properties = ['username', 'name']
>>> user = UserCache(id=10)
>>> print user.username
>>> user.username = 'username'
>>> = 'Real Name'
>>> print user.username
>>> user10 = UserCache(id=10)
>>> print user10.username

Cache is stored with class name and given id.

>>> print user.get('username', use_cache=True)

If you don't want to hit backend again, there is use_cache option for local memory cache.

For non-local cache backend, try a easy generator.

>>> from cacheobj.redis import get_redis_object
>>> import redis
>>> MyRedisObject = get_redis_object(redis.ConnectionPool()) # any connection pool
>>> class MyUserCache(MyRedisObject):
...   pass

Custom Backend

Upper examples are shortcut for basic configuration.

>>> from cacheobj import SimpleCacheObject
>>> from cacheobj.backend.memcache import MemcacheBackend
>>> def get_backend():
...   return MemcacheBackend([''])
>>> class UserCache(SimpleCacheObject):
...   _backend_generator = staticmethod(get_backend)
...   _properties = ['username', 'name']

This object works as upper UserCache object. You can put custom backend with this.

See source code to write a backend. It is just a few lines.

Composite Example

You can composite multiple backends for an object.

>>> from cacheobj import CacheObject
>>> from cacheobj.backend.memory import MemoryBackend
>>> from cacheobj.backend.memcache import MemcacheBackend
>>> from cacheobj.backend.redis import RedisBackend
>>> memory = MemoryBackend()
>>> memcache = MemcacheBackend()
>>> redis = RedisBackend()
>>> class CompositeCache(CacheObject):
... _backends = {
...   memory: ['mem1', 'mem2'],
...   memcache: ['mc1', 'mc2'],
...   redis: ['redis1', 'redis2'],
... }
>>> c = CompositeCache()
>>> c.mem1 # with backend memory
>>> c.mc1 # with backend memcache
>>> c.redis1 # with backend redis