leetcode359. 日志速率限制器

举报
兔老大 发表于 2021/04/22 23:14:28 2021/04/22
【摘要】 请你设计一个日志系统,可以流式接收日志以及它的时间戳。 该日志会被打印出来,需要满足一个条件:当且仅当日志内容 在过去的 10 秒钟内没有被打印过。 给你一条日志的内容和它的时间戳(粒度为秒级),如果这条日志在给定的时间戳应该被打印出来,则返回 true,否则请返回 false。 要注意的是,可能会有多条日志在同一时间被系统接收。 示例:...

请你设计一个日志系统,可以流式接收日志以及它的时间戳。

该日志会被打印出来,需要满足一个条件:当且仅当日志内容 在过去的 10 秒钟内没有被打印过。

给你一条日志的内容和它的时间戳(粒度为秒级),如果这条日志在给定的时间戳应该被打印出来,则返回 true,否则请返回 false。

要注意的是,可能会有多条日志在同一时间被系统接收。

示例:

Logger logger = new Logger();

// 日志内容 "foo" 在时刻 1 到达系统
logger.shouldPrintMessage(1, "foo"); returns true; 

// 日志内容 "bar" 在时刻 2 到达系统
logger.shouldPrintMessage(2,"bar"); returns true;

// 日志内容 "foo" 在时刻 3 到达系统
logger.shouldPrintMessage(3,"foo"); returns false;

// 日志内容 "bar" 在时刻 8 到达系统
logger.shouldPrintMessage(8,"bar"); returns false;

 

// 日志内容 "foo" 在时刻 10 到达系统
logger.shouldPrintMessage(10,"foo"); returns false;

// 日志内容 "foo" 在时刻 11 到达系统
logger.shouldPrintMessage(11,"foo"); returns true;

思路:我们可以用一个双端队列维护所有出现过的日志,然后去掉那些过期的,保证队列里是十秒内的就ok,但是费时间。

我的思路是一个map记录最后一次出现的时间,新日志请求去查一下map即可,这样做的好处是速度快,坏处是map的空间可能会无限扩张,这时你可以定时或者定量去删掉过期的记录(我并没有写这个逻辑)


  
  1. class Logger {
  2. private HashMap<String, Integer> msgDict;
  3. /** Initialize your data structure here. */
  4. public Logger() {
  5. msgDict = new HashMap<String, Integer>();
  6. }
  7. /**
  8. * Returns true if the message should be printed in the given timestamp, otherwise returns false.
  9. */
  10. public boolean shouldPrintMessage(int timestamp, String message) {
  11. //没出现过
  12. if (!msgDict.containsKey(message) || timestamp - msgDict.get(message) >= 10) {
  13. //未出现,或时间差超过十秒
  14. msgDict.put(message, timestamp);
  15. return true;
  16. } else {
  17. //十秒内出现过
  18. return false;
  19. }
  20. }
  21. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/106444519

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。