class Client(object): u'''不能从KVClient继承,因为sae线上的kvdb需要分配server,而本地的不需要, 继承之后,在__init__的参数server不能正确传入 ''' def __init__(self, json_k_suffix, autosave=False): self._suffix = json_k_suffix self._autosave = autosave self.kv = Kv() def _do(self, key, value, func): if self._autosave: # kvdb在dev_server源码里面reload的时候不会保存数据到磁盘造成丢失, # 这里在调试模式下解决,线上环境时可删除,以提高运行速率 try: import sae.kvdb import os yes = os.environ.get('sae.run_main', '1') os.environ['sae.run_main'] = yes sae.kvdb._save_cache() except AttributeError: pass return value if not key.endswith(self._suffix) else func(value) def get(self, key, default=None): '''如果是json数据,那么返回解析为python对象后的数据''' if isinstance(key, unicode): key = key.encode('u8') value = self._do(key, self.kv.get(key), loads) return value if value is not None else default def set(self, key, value, min_compress_len=0): '''如果是json数据,那么先将python对象转换为json字符串''' if isinstance(key, unicode): key = key.encode('u8') value = self._do(key, value, dumps) return self.kv.set(key, value, min_compress_len) def add(self, key, value, min_compress_len=0): '''如果是json数据,那么先将python对象转换为json字符串''' if isinstance(key, unicode): key = key.encode('u8') value = self._do(key, value, dumps) return self.kv.add(key, value, min_compress_len)
from config import MEMCACHED_ADDR kw = {} kw['comp_threshold'] = 4096 mc = cmemcached.Client(MEMCACHED_ADDR) else: import pylibmc mc = pylibmc.Client() try: from sae.kvdb import KVClient kv = KVClient() _set_ = kv.set def set(key, val, time=0, min_compress_len=4096): _set_(key, val, time, min_compress_len) kv.set = set except ImportError: from kvstore import kv from zorm_sae.mc_connection import init_mc import zorm_sae.config zorm_sae.config.mc = mc = init_mc( mc, disable_local_cached=DISABLE_LOCAL_CACHED ) from zorm_sae.mc import McCacheM, McCache, McNum, McCache, McLimitA, McCacheA, McLimitM if __name__ == "__main__": pass
class SAEKvdb(object): ''' A bridge for pyutils kvdb wrapper to access SAE KVDB. e.g. from pyutils import KVDBWrapper from sae_kvdb import SAEKvdb kvclient = KVDBWrapper(SAEKvdb, prefix='PRE:', ...) kvclient.set(key,value) kvclient.get(key) ''' def __init__(self, **kwargs): if 'prefix' in kwargs: self.prefix = kwargs['prefix'] del kwargs['prefix'] else: self.prefix = '' self.prefix = str(self.prefix) self.kv = KVClient(**kwargs) def info(self): return self.kv.get_info() def get(self, key, **kwargs): k = self.gen_key(key) return self.kv.get(k) def set(self, key, value, **kwargs): k = self.gen_key(key) return self.kv.set(k, value, **kwargs) def delete(self, key, **kwargs): k = self.gen_key(key) return self.kv.delete(k, **kwargs) def exist(self, key, **kwargs): k = self.gen_key(key) existed = not self.kv.add(k, '') if not existed: self.kv.delete(k) return existed def scan(self, cursor='', count=20, **kwargs): ''' Retrieve keys by given arguments :param kwargs: 'count' for retrieve count; 'cursor' is the key for next time retrieve :return: ''' return self.kv.getkeys_by_prefix(prefix=self.prefix, marker=cursor, limit=count, **kwargs) def scanv(self, cursor='', count=20, **kwargs): ''' Retrieve key-values by given arguments :param kwargs: 'count' for retrieve count; 'cursor' is the key for next time retrieve :return: ''' return self.kv.get_by_prefix(prefix=self.prefix, marker=cursor, limit=count, **kwargs) def mget(self, keys, **kwargs): return self.kv.get_multi(keys, key_prefix=self.prefix) def gen_key(self, key): k = self.prefix + str(key) return k