backend.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. from django.core.cache.backends.base import DEFAULT_TIMEOUT
  4. from library.pymemcache.serde import python_memcache_serializer, python_memcache_deserializer
  5. try:
  6. import cPickle as pickle
  7. except ImportError:
  8. import pickle
  9. from . import client
  10. from django.core.cache.backends.memcached import BaseMemcachedCache
  11. class PyMemcacheCache(BaseMemcachedCache):
  12. """An implementation of a cache binding using pymemcache."""
  13. def __init__(self, server, params):
  14. BaseMemcachedCache.__init__(
  15. self,
  16. server,
  17. params,
  18. library = client,
  19. value_not_found_exception = ValueError
  20. )
  21. self._client = None
  22. @property
  23. def _cache(self):
  24. if not self._client:
  25. kwargs = {
  26. 'serializer': python_memcache_serializer,
  27. 'deserializer': python_memcache_deserializer,
  28. }
  29. if self._options:
  30. for key, value in self._options.items():
  31. kwargs[key.lower()] = value
  32. # default use_pooling
  33. if "use_pooling" not in kwargs:
  34. kwargs["use_pooling"] = True
  35. # if "ignore_exc" not in kwargs:
  36. # kwargs["ignore_exc"] = True
  37. servers = []
  38. for server in self._servers:
  39. host, port = server.split(":")
  40. servers.append((host, int(port)))
  41. self._client = self._lib.Client(servers, **kwargs)
  42. return self._client
  43. def get(self, key, default = None, version = None, ignore_exc = True):
  44. key = self.make_key(key, version = version)
  45. val = self._cache.get(key, ignore_exc = ignore_exc)
  46. if val is None:
  47. return default
  48. return val
  49. def cas(self, key, value, cas, timeout = DEFAULT_TIMEOUT):
  50. key = self.make_key(key)
  51. if cas is None:
  52. return self._cache.set(key, value, self.get_backend_timeout(timeout))
  53. else:
  54. return self._cache.cas(key, value, cas, self.get_backend_timeout(timeout))
  55. def gets(self, key, ignore_exc = False):
  56. key = self.make_key(key)
  57. return self._cache.gets(key, ignore_exc = ignore_exc)