[Checkins] SVN: lovely.memcached/trunk/src/lovely/memcached/ added
possibility to have raw cache keys,
the set method now returns the generated key
Bernd Dorn
bernd.dorn at lovelysystems.com
Mon Apr 16 12:23:42 EDT 2007
Log message for revision 74182:
added possibility to have raw cache keys, the set method now returns the generated key
Changed:
U lovely.memcached/trunk/src/lovely/memcached/README.txt
U lovely.memcached/trunk/src/lovely/memcached/utility.py
-=-
Modified: lovely.memcached/trunk/src/lovely/memcached/README.txt
===================================================================
--- lovely.memcached/trunk/src/lovely/memcached/README.txt 2007-04-16 16:20:17 UTC (rev 74181)
+++ lovely.memcached/trunk/src/lovely/memcached/README.txt 2007-04-16 16:23:41 UTC (rev 74182)
@@ -22,9 +22,11 @@
>>> util.defaultLifetime
3600
-To store a new value in the cache we just need to set it.
+To store a new value in the cache we just need to set it. The set
+method returns the generated memcached key for the cache key.
>>> util.set('cached value', 'cache_key')
+ '188693688126b424eb89e1385eca6f01'
>>> util.query('cache_key')
'cached value'
@@ -36,7 +38,7 @@
We have extended the original implementation on memcache.py for unicode.
- >>> util.set(u'cached value ä', 'cache_key')
+ >>> key = util.set(u'cached value ä', 'cache_key')
>>> util.query('cache_key') == u'cached value ä'
True
@@ -56,8 +58,8 @@
>>> util1 = MemcachedClient(defaultNS=u'1')
>>> util2 = MemcachedClient(defaultNS=u'2')
- >>> util1.set(1,1)
- >>> util2.set(2,2)
+ >>> k = util1.set(1,1)
+ >>> k = util2.set(2,2)
>>> util1.query(1)
1
>>> util1.query(2) is None
@@ -89,10 +91,10 @@
The key tracking adds on overhead so it must be enabled explicitly.
>>> util3 = MemcachedClient(trackKeys=True)
- >>> util3.set(1,1)
+ >>> k = util3.set(1,1)
>>> sorted(util3.keys())
[1]
- >>> util3.set(2,2)
+ >>> k = util3.set(2,2)
>>> sorted(util3.keys())
[1, 2]
@@ -116,7 +118,7 @@
Keys expire too
- >>> util3.set(4, 4, lifetime=1)
+ >>> k = util3.set(4, 4, lifetime=1)
>>> sorted(util3.keys())
[1, 2, 3, 4]
>>> import time
@@ -128,7 +130,7 @@
Keys are always bound to a namespace.
- >>> util3.set(5, 5, ns=u'3')
+ >>> k = util3.set(5, 5, ns=u'3')
If not give the ``None`` namespace is used.
@@ -148,6 +150,52 @@
>>> util3._keysUpdate([1,2], u'speed')
+
+Raw Keys
+========
+
+Normaly the utility generates md5 hash keys in order to have short
+keys. Sometimes, if an axternal application wants to have access to
+the values, it is usefull to be able to set keys explicitly. This can
+be done by setting the raw keyword argument to True on the set
+and query methods.
+
+ >>> util4 = MemcachedClient()
+
+If raw is used, the key must be a string.
+
+ >>> k = util.set(u'value of a', u'a', raw=True)
+ Traceback (most recent call last):
+ ValueError: u'a'
+
+ >>> util.set(u'value of a', 'a', raw=True)
+ 'a'
+
+The namespace is simply prepended to the key if provided. And must be
+a string too.
+
+ >>> util.set(u'value of a', 'a', ns=u'NS_', raw=True)
+ Traceback (most recent call last):
+ ValueError: u'NS_a'
+ >>> util.set(u'value of a', 'a', ns='NS_', raw=True)
+ 'NS_a'
+
+Now we need can get the value with the raw key.
+
+ >>> util.query('a', raw=True)
+ u'value of a'
+ >>> util.query('a', raw=False) is None
+ True
+
+Also invalidation takes a raw argument.
+
+ >>> util.invalidate('a')
+ >>> util.query('a', raw=True)
+ u'value of a'
+ >>> util.invalidate('a', raw=True)
+ >>> util.query('a', raw=True) is None
+ True
+
Statistics
==========
@@ -161,7 +209,7 @@
server. As soon as a server is back online it will immediately used.
>>> util.servers = ['127.0.0.1:8125']
- >>> util.set('cached value', 'cache_object')
+ >>> k = util.set('cached value', 'cache_object')
>>> util.query('cache_object') is None
True
Modified: lovely.memcached/trunk/src/lovely/memcached/utility.py
===================================================================
--- lovely.memcached/trunk/src/lovely/memcached/utility.py 2007-04-16 16:20:17 UTC (rev 74181)
+++ lovely.memcached/trunk/src/lovely/memcached/utility.py 2007-04-16 16:23:41 UTC (rev 74182)
@@ -30,6 +30,7 @@
from zope.schema.fieldproperty import FieldProperty
from zope import interface
from interfaces import IMemcachedClient
+from types import StringType
log = logging.getLogger('lovely.memcached')
@@ -61,7 +62,7 @@
def getStatistics(self):
return self.client.get_stats()
- def set(self, data, key, lifetime=None, ns=None):
+ def set(self, data, key, lifetime=None, ns=None, raw=False):
if lifetime is None:
lifetime = self.defaultLifetime
ns = ns or self.defaultNS or None
@@ -70,23 +71,25 @@
log.debug('set: %r, %r, %r, %r' % (key,
len(data), ns,
lifetime))
-
- self.client.set(self._buildKey(key, ns), data, lifetime)
+
+ bKey = self._buildKey(key, ns, raw=raw)
+ self.client.set(bKey, data, lifetime)
self._keysSet(key, ns, lifetime)
+ return bKey
- def query(self, key, default=None, ns=None):
+ def query(self, key, default=None, ns=None, raw=False):
ns = ns or self.defaultNS or None
- res = self.client.get(self._buildKey(key, ns))
+ res = self.client.get(self._buildKey(key, ns, raw=raw))
if res is None:
return default
return cPickle.loads(res)
- def invalidate(self, key, ns=None):
+ def invalidate(self, key, ns=None, raw=False):
ns = ns or self.defaultNS or None
log.debug('invalidate: %r, %r '% (key, ns))
if self.trackKeys:
self.client.delete(self._buildKey((ns, key), STAMP_NS))
- self.client.delete(self._buildKey(key, ns))
+ self.client.delete(self._buildKey(key, ns, raw))
def invalidateAll(self):
# notice this does not look at namespaces
@@ -94,7 +97,7 @@
if hasattr(self, '_v_storage'):
del self._v_storage
- def _buildKey(self, key, ns):
+ def _buildKey(self, key, ns, raw=False):
"""builds a key for key and ns, if key is a persistent
object its oid is used
@@ -132,8 +135,18 @@
>>> kb1 = vc1._buildKey(b, 1)
>>> ka1 == kb1
False
+
+ If we set the key to raw we must provide a string
+
"""
+ if raw is True:
+ if ns:
+ key = ns+key
+ if type(key)!= StringType:
+ raise ValueError, repr(key)
+ return key
+
oid = getattr(key, '_p_oid', None)
if oid is not None:
key = oid
More information about the Checkins
mailing list