赞
踩
一个小时内分统计数据 按 分钟分60段 + 一个 标识字段 使用了 %Y%m%d%H。
redis Hash 初始化记录 一小时内每分钟的统计数据
判断 是否在同个小时, 非同个小时内直接hset覆盖掉之前的数据, 如果是同个小时内 使用hincrby累加对应分钟的数量
通过 hvals 计算总和
""" key : redis key inc_value : 累加的数量 """ def get_report_num_by_hour(key, inc_value): hour, minute = time.strftime("%Y%m%d%H-%M").split("-") hash_key = RedisUtil.exists(name=key) # 是否存在 if hash_key: # 是否为同个小时内 if hour == RedisUtil.hget(key, 'hour'): # 对应分钟 累加对应的数量 RedisUtil.hincrby(key, int(minute), inc_value) else: # 非同个小时直接重新设置小时为新的数量 RedisUtil.hset(key, int(minute), inc_value) else: # 初始化一小时 hash_value = {} for x in range(61): if x == 60: # 记录当时 hash_value['hour'] = hour else: hash_value[x] = 0 RedisUtil.hmset(key, hash_value) # 对应分钟加1 RedisUtil.hincrby(key, int(minute), inc_value) RedisUtil.expire(key=key, time=3600) # 获取所有值 hash_list = CacheUtil.hvals(key) last_index = len(hash_list) - 1 total_num = 0 for k, v in enumerate(hash_list): if k != last_index: # 去除最后一位的标识 total_num += int(v) return total_num
与分钟类似 , 24小时内分统计数据 按 小时分成24段 + 一个 标识字段 使用了 %Y%m%d。
redis Hash 初始化记录 24小时内每小时的统计数据
判断 是否在同一天, 非同一天内直接hset覆盖掉之前的数据, 如果是同一天内 使用hincrby累加对应小时的数量
通过 hvals 计算总和
def get_report_num_by_day(key, inc_value=1): d, h = time.strftime("%Y%m%d-%H").split("-") hash_key = RedisUtil.exists(name=key) # 是否存在 if hash_key: # 是否为当天 if d == RedisUtil.hget(key, 'day'): # 对应小时+1 RedisUtil.hincrby(key, int(h), inc_value) else: # 非当天直接重新设置小时为+1 RedisUtil.hset(key, int(h), inc_value) else: # 初始化24小时 hash_value = {} for x in range(25): if x == 24: # 记录当日 hash_value['day'] = d else: hash_value[x] = 0 RedisUtil.hmset(key, hash_value) # 对应小时加1 RedisUtil.hincrby(key, int(h), inc_value) RedisUtil.expire(key=key, time=86400) # 获取所有值 hash_list = CacheUtil.hvals(key) last_index = len(hash_list) - 1 total_num = 0 for k, v in enumerate(hash_list): if k != last_index: # 去除最后一位的标识 total_num += int(v) return total_num
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。