Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Python cache interface with object-property interface.

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 cacheobj
Octocat-spinner-32 cacheobjtests
Octocat-spinner-32 .gitignore
Octocat-spinner-32 LICENSE
Octocat-spinner-32 README.rst
Octocat-spinner-32 setup.py
README.rst

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.

Example

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
None
>>> user.username = 'username'
>>> user.name = 'Real Name'
>>> print user.username
username
>>> user10 = UserCache(id=10)
>>> print user10.username
username

Cache is stored with class name and given id.

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

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(['127.0.0.1:11211'])
...
>>> 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
Something went wrong with that request. Please try again.