Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 滑动窗口报告缓存_Python_Flask_Caching_Redis - Fatal编程技术网

Python 滑动窗口报告缓存

Python 滑动窗口报告缓存,python,flask,caching,redis,Python,Flask,Caching,Redis,我有一个api端点,它接受一些带有“date_from”和“date_to”字段的数据作为输入 当发出请求时,它将启动报告的生成。这些“日期从”和“日期到”字段用于生成子请求的数量。基于这些子请求中的每一个子请求,生成哈希,该哈希用于通过哈希从redis数据库获取子响应,或者生成一些等式,然后将该子响应保存到redis。最后,所有子响应被聚合并作为实际响应返回 我有一个用例,其中所有的数据都已经存储在redis中,但是从date到date再到date再到date再到date仍然是(date-to

我有一个api端点,它接受一些带有“date_from”和“date_to”字段的数据作为输入

当发出请求时,它将启动报告的生成。这些“日期从”和“日期到”字段用于生成子请求的数量。基于这些子请求中的每一个子请求,生成哈希,该哈希用于通过哈希从redis数据库获取子响应,或者生成一些等式,然后将该子响应保存到redis。最后,所有子响应被聚合并作为实际响应返回

我有一个用例,其中所有的数据都已经存储在redis中,但是从date到date再到date再到date再到date仍然是
(date-to-date-from)。天
对缓存数据库的请求量。 所以我决定也通过生成散列以同样的方式将请求的最终响应存储在redis中

我的问题是,这些报告是定期生成的,带有date_from和date_to的滑动窗口。例如,昨天是从2017-03-08日期到2020-05-07日期,但今天是从2017-03-09日期到2020-05-08日期。也就是说

  • 大部分报告都是缓存的,但这段时间会让整个过程变得非常缓慢
  • 昨天已经准备好了非常类似的报告,可以在几秒钟内访问,但它并不完整,也无法知道它们是否相似 这是我的密码

    def generate_report(self, serialized_data):
        result = {
                'deviation' : []
                 }
        total_hash = hashlib.sha256(str(serialized_data).encode()).hexdigest()
        total_target = self.redis.get(total_hash)
        if not total_target:
            for date_from, date_to in self.date_range:
                serialized_data['media_company']['date_from'] = \
                                                    date_from.strftime("%Y-%m-%d")
                serialized_data['media_company']['date_to'] = \
                                                    date_to.strftime("%Y-%m-%d")
                hash = hashlib.sha256(str(serialized_data).encode()).hexdigest()
                target = self.redis.get(hash)
                media_company, context, validator = \
                                        self.prepare_for_validation(serialized_data)
                if not target:
                    target = validator.check({'media_company': media_company, **context})
                    self.redis.setex(hash, timedelta(days=180), json.dumps(target))
                else:
                    self.redis.expire(hash, timedelta(days=180))
                    target = json.loads(target)
    
                result['deviation'].append(target['deviation'])
                result['date'] = [str(date_to) for date_from, date_to in self.date_range]
            total_target = result
            self.redis.setex(total_hash, timedelta(days=180), json.dumps(total_target))
        else:
            total_target = json.loads(total_target)
        return total_target
    
    total_hash表示初始数据的散列

    self.date\u range表示子请求的日期范围数组

    哈希表示子查询的哈希


    你能推荐一种更好的缓存数据的方法吗?或者是加速这个算法的方法?

    你可以考虑在循环中使用ReIIS流水线而不是单独的GET命令,我不知道Python代码怎么做,但是跟随原型可以帮助你

    p1 = self.redis.pipeline()
    if not total_target:
      for date_from, date_to in self.date_range:
         #use pipeline here to get target for each day.
         hash = hashlib.sha256(str(serialized_data).encode()).hexdigest()
         p1.get(hash)
    
    #use other pipeline here to set values and expires base on result
    #also compute target_toal
    p2 = self.redis.pipeline()
    for result in p1.execute():
       if not result:
          -- p2 set value with expiry
       else
          -- p2 set expiry
    

    这是一个巨大的加速!谢谢