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