better memcache support?

This commit is contained in:
mdipierro
2012-08-15 14:55:55 -05:00
parent def270c298
commit d9ef136111
3 changed files with 39 additions and 28 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.0 (2012-08-15 14:23:38) dev
Version 2.00.0 (2012-08-15 14:55:51) dev
+7 -5
View File
@@ -175,6 +175,7 @@ class CacheInRam(CacheAbstract):
"""
dt = time_expire
now = time.time()
self.locker.acquire()
item = self.storage.get(key, None)
@@ -187,14 +188,14 @@ class CacheInRam(CacheAbstract):
if f is None:
return None
if item and (dt is None or item[0] > time.time() - dt):
if item and (dt is None or item[0] > now - dt):
return item[1]
elif item and (item[0] < time.time() - dt) and destroyer:
elif item and (item[0] < now - dt) and destroyer:
destroyer(item[1])
value = f()
self.locker.acquire()
self.storage[key] = (time.time(), value)
self.storage[key] = (now, value)
self.storage[CacheAbstract.cache_stats_name]['misses'] += 1
self.locker.release()
return value
@@ -345,15 +346,16 @@ class CacheOnDisk(CacheAbstract):
if storage:
storage.close()
now = time.time()
if f is None:
return None
if item and (dt is None or item[0] > time.time() - dt):
if item and (dt is None or item[0] > now - dt):
return item[1]
value = f()
storage = self._open_shelf_with_lock()
try:
storage[key] = (time.time(), value)
storage[key] = (now, value)
storage[CacheAbstract.cache_stats_name] = {
'hit_total': storage[CacheAbstract.cache_stats_name]['hit_total'],
+31 -22
View File
@@ -10,21 +10,19 @@ cache.memcache = MemcacheClient(request,[127.0.0.1:11211],debug=true)
import cPickle as pickle
import thread
from gluon import current
locker = thread.allocate_lock()
DEFAULT_TIME_EXPIRE = 300 # seconds (must be the same as cache.ram)
def MemcacheClient(*a, **b):
locker.acquire()
try:
if not hasattr(MemcacheClient, '__mc_instance'):
MemcacheClient.__mc_instance = _MemcacheClient(*a, **b)
finally:
locker.release()
return MemcacheClient.__mc_instance
if not hasattr(current,'__mc_instance'):
current.__memcache_client = MemcacheClientObj(*a, **b)
return current.__memecache_client
class _MemcacheClient(Client):
class MemcacheClientObj(Client):
meta_storage = {}
max_time_expire = 24*3600
def __init__(self, request, servers, debug=0, pickleProtocol=0,
pickler=pickle.Pickler, unpickler=pickle.Unpickler,
@@ -45,33 +43,44 @@ class _MemcacheClient(Client):
else:
self.storage = self.meta_storage[app]
def __call__(self, key, f, time_expire=300):
def __call__(self, key, f,
time_expire=DEFAULT_TIME_EXPIRE,
destroyer = None):
if time_expire == None:
time_expire = 10**10
time_expire = self.max_time_expire
# this must be commented because get and set are redefined
# key = self.__keyFormat__(key)
now = time.time()
value = None
obj = self.get(key)
if obj:
value = obj
elif f is None:
if obj: self.delete(key)
else:
if f is None:
self.delete(key)
elif time_expire==0:
value = f()
self.set(key, value, time_expire)
self.set(key, value, self.max_time_expire)
self.set(key+':time()', now, self.max_time_expire)
else:
value = self.get(key)
t0 = self.get(key+':time()')
if value and t0:
if (t0 < now - dt) and destroyer:
destroyer(value)
else:
value = f()
self.set(key, value, self.max_time_expire)
self.set(key+':time()', now, self.max_time_expire)
return value
def increment(self, key, value=1, time_expire=300):
def increment(self, key, value=1, time_expire=DEFAULT_TIME_EXPIRE):
""" time_expire is ignored """
newKey = self.__keyFormat__(key)
obj = Client.get(self, newKey)
if obj:
return Client.incr(self, newKey, value)
else:
Client.set(self, newKey, value, time_expire)
Client.set(self, newKey, value, self.max_time_expire)
return value
def set(self, key, value, time_expire=300):
def set(self, key, value, time_expire=DEFAULT_TIME_EXPIRE):
newKey = self.__keyFormat__(key)
return Client.set(self, newKey, value, time_expire)