Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
    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
Пример #4
0
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