我有条件需要计算HTTP服务器上发出的请求数,按小时和请求类型汇总。 例如 - 如果我有3个唯一的资源请求,那么这是我想要获得的输出数据
Resource /a - 10 req between 10pm - 11pm, 13 req between 11pm - 12am
Resource /b - 14 req between 10pm - 11pm, 17 req between 11pm - 12am
Resource /c - 12 req between 10pm - 110m, 16 req between 11pm - 12am
不需要实时报告。它可以延迟几个小时。我知道我可以通过日志解析来实现这一点。但只是想知道是否有更好的方法来存储这种数据。让我们说Redis中的一个实时计数器,其中密钥是使用url + hour
进行的,并定期转储它,然后每隔2小时对其他数据库说一次。
答案 0 :(得分:1)
日志解析或Google Analytics(托管)或Piwik(自托管)等分析系统是您的最佳选择。不要尝试跟踪代码中的视图,因为如果您在其前面添加了整页缓存,则每次跟踪匹配时都不会运行代码。
答案 1 :(得分:1)
将其存储在redis中的一种方法是使用哈希: -
哈希键作为日期时间样本
hashkey: - " 2016-04-27-10-11"
"2016-04-27-10-11" :{
"md5-request-uri-1" : "count of request",
"md5-request-uri-2" : "count of request"
}
您可以使用的Redis函数是: - hash in(HINCRBY)
HINCRBY 2016-04-27-10-11 md5-request-uri-1 1
http://redis.io/commands/HINCRBY
现在你可以有一个每小时的cron来解析过去一小时的日志,并将它们以上述格式存储在redis中。
要获得所有可用资源,您可以使用: - HGETALL 要获取您可以使用的特定资源的计数: - HGET
答案 2 :(得分:0)
我假设你的应用程序中有Servlet,在高级过滤器中应用这样的逻辑
hincrby(日期+行动,小时,1);
date -> current date
hour -> current hour
action -> the action you want to save
如果您想要对整个日期执行操作计数,请针对特定小时框执行hgetall日期+操作,您可以从应用程序逻辑中的地图中单独选择。做总和,那是你的结果。
这样,每个请求只会发生一次命中。 Redis需要1ms。我们一直以这种方式使用Redis进行实时分析。
答案 3 :(得分:0)
我是Redis的粉丝,但我不会像这样使用Redis。我会使用像RabbitMQ这样的Message Queue,甚至更好的Kafka。只需将您的请求转储到那里并有一个不同的流程从那里挑选并处理它。
没有理由为计算计数器或执行需要响应的任何内容添加延迟(即使它是1毫秒)。