redis上下文实现

# -*- coding: utf-8 -*-


import redis
import ast


def redis_event(f):
    def inner(*args, **kw):
        try:
            f_ret = f(*args, **kw)
        except Exception as e:
            raise e.args
        else:
            return f_ret

    return inner


class hzc_redis():
    def __init__(self, **kwargs):
        self.redis_pool = redis.ConnectionPool(decode_responses=True, max_connections=20, socket_connect_timeout=10,
                                               **kwargs)
        self.redis_obj = redis.Redis(connection_pool=self.redis_pool, decode_responses=True)
        try:
            self.redis_obj.ping()
        except TimeoutError:
            raise TimeoutError("redis连接超时")
        except ConnectionError:
            raise TimeoutError("redis连接失败")
    def remove_list(self, s, d):
        """
        删除列表 从尾部
        :param s:
        :param d:
        :return:
        """
        return self.redis_obj.rpoplpush(s, d)

    def get_list_len(self, key):
        """
        获取 列表长度
        :param key:
        :return:
        """
        return self.redis_obj.llen(key)

    def get_list(self, key):
        """
        获取列表 所有val
        :param key:
        :return:
        """
        return [eval(i) for i in self.redis_obj.lrange(key, 0, -1)]

    def delete_list(self, key):
        """
        删除列表 从头部
        :param key:
        :return:
        """
        return eval(self.redis_obj.lpop(key))

    def hash_set_val(self, name, k, v, mount=None):
        """
        hash 设置值
        :param name: hash name
        :param k:
        :param v:
        :param mount: {k:v}
        :return:
        """
        return self.redis_obj.hset(name, k, v) if mount is None else self.redis_obj.hmset(name, mount)

    def hash_get_key(self, name, k):
        """
        获取 hash
        :param name: hash name
        :param key: name key
        :return: name and key  == True 则返回name中的key  若为False 则返回 该name下所有val
        """

        return eval(self.redis_obj.hget(name=name, key=k)) if name and k else self.redis_obj.hkeys(name)

    def hash_get_len(self, name):
        """
        获取hash长度
        :param name:
        :return:
        """
        return self.redis_obj.hlen(name)

    def hash_get_all_val(self, name):
        """
        获取 hash中所有的key
        :param name:
        :return:
        """
        return self.redis_obj.hvals(name)

    def hash_is_key(self, name, key):
        """
        判断 hash中有没有key
        :param name:
        :param key:
        :return:
        """
        return self.redis_obj.hexists(name, key)

    def hash_get_gen(self, name):
        """
        :param name:
        :return: 生成器对象
        """
        return self.redis_obj.hscan(name)

    @redis_event
    def str_set(self, name, val, time=1800):
        return self.redis_obj.setex(name, val, time)

    @redis_event
    def str_get(self, name):
        return self.redis_obj.get(name)

    __setitem__ = redis_event(lambda x, m, n: x.redisCli.rpush(m, n))

    """不兼容 datetime 对象 若返回值中有"""
    __getitem__ = redis_event(lambda x, n: [ast.literal_eval(i) for i in x.redisCli.lrange(n, 0, -1)])

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        return exc_type, exc_val, exc_tb


if __name__ == '__main__':
    from api import public
    redis_config = public.ENV_SEVICE_MAP.get("redis_config").get("local")
    print(redis_config)
    with hzc_redis(**redis_config) as red_obj:
        hash_name = "2021-03-31"
        val = ["ddd", "dfff", "dfsdf", "dsfdsf"]
        ret = red_obj.hash_set_val(hash_name, "hash_key", val)
        print(red_obj.hash_get_key("2021-03-31"))

  

posted @ 2021-05-28 09:39  Yuan_x  阅读(67)  评论(0编辑  收藏  举报