IMO,您不应该使用 Redis 作为缓冲区来存储您的日志行并在之后批量处理它们。为此消耗内存并没有真正的意义。通过在单个服务器中收集日志并将它们写入文件系统,您将获得更好的服务。
现在你可以用 Redis 做的是尝试实时计算你的统计数据。这就是 Redis 真正闪耀的地方。无需将原始数据保存在 Redis 中(稍后批量处理),您可以直接存储和汇总您需要计算的统计信息。
例如,对于每个日志行,您可以将以下命令通过管道传输到 Redis:
zincrby day:top:keyword 1 my_keyword
zincrby day:top:url 1 my_url
incr day:nb_req
这将计算当天的热门关键字、热门网址和请求数。在一天结束时:
# Save data and reset counters (atomically)
multi
rename day:top:keyword tmp:top:keyword
rename day:top:url tmp:top:url
rename day:nb_req tmp:nb_req
exec
# Keep only the 100 top keyword and url of the day
zremrangebyrank tmp:top:keyword 0 -101
zremrangebyrank tmp:top:url 0 -101
# Aggregate monthly statistics for keyword
multi
rename month:top:keyword tmp
zunionstore month:top:keyword 2 tmp tmp:top:keyword
del tmp tmp:top:keyword
exec
# Aggregate monthly statistics for url
multi
rename month:top:url tmp
zunionstore month:top:url 2 tmp tmp:top:url
del tmp tmp:top:url
exec
# Aggregate number of requests of the month
get tmp:nb_req
incr month:nb_req <result of the previous command>
del tmp:nb_req
在月末,过程完全相似(使用 zunionstore 或 get/incr 对月度数据进行汇总,以汇总年度数据)。
这种方法的主要好处是为每个日志行完成的操作数量是有限的,而每月和每年的聚合可以很容易地计算出来。