首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滑动窗口报告缓存

滑动窗口报告缓存
EN

Stack Overflow用户
提问于 2020-05-08 11:48:21
回答 1查看 140关注 0票数 0

我有一个api端点,它以"date_from“和"date_to”字段作为输入。

当提出请求时,它将启动报表的生成。这些"date_from“和"date_to”字段用于生成(date_to - date_from).days数量的子请求。根据这些子请求中的每一个,生成散列,该散列用于通过散列从redis数据库获取子响应,或者创建一些方程,然后将该子响应保存到redis。最后,所有子响应被聚合并作为实际响应返回。

我有一个用例,其中所有的数据已经存储在redis中,但是在date_to和date_from的长范围内,对缓存数据库的请求仍然是(date_to - date_from).days量。因此,我还决定以相同的方式通过生成散列将请求的最终响应存储在redis中。

我的问题是这些报告是通过date_from和date_to的滑动窗口定期生成的。例如,昨天的date_from = "2017-03-08" date_to = "2020-05-07",但今天将是date_from = "2017-03-09" date_to = "2020-05-08"。这意味着

  1. 大部分的报告都是缓存的,但是每天的时间会减缓这个过程--令人难以置信的是,
  2. --非常相似的报告--昨天已经准备好了,可以在几秒钟内访问,但是它还不够满,也无法知道它们是相似的。

这是我的密码

代码语言:javascript
复制
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_range表示子请求的日期范围数组,

散列表示子查询的散列。

您是否可以推荐一种更好的缓存数据的方法,或者可能是加速此算法的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 19:05:20

您可以考虑在循环中使用redis管道而不是单独的get命令,我不确定python代码如何做到这一点,但是下面的原型可能会帮助您

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61678477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档