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"))