IMO、ログ行を保存して後でバッチで処理するためのバッファとしてRedisを使用しないでください。このためにメモリを消費することは実際には意味がありません。ログを単一のサーバーに収集し、ファイルシステムに書き込むことで、より適切にサービスを提供できます。
現在、Redisでできることは、統計をリアルタイムで計算しようとしていることです。これがRedisが本当に輝いているところです。生データをRedisに保持する(後でバッチで処理する)代わりに、計算する必要のある統計を直接保存して集約することができます。
たとえば、ログ行ごとに、次のコマンドをRedisにパイプライン処理できます。
zincrby day:top:keyword 1 my_keyword
zincrby day:top:url 1 my_url
incr day:nb_req
これにより、当日の上位キーワード、上位URL、およびリクエスト数が計算されます。一日の終わりに:
# 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を使用して、年次データを集計します)。
このアプローチの主な利点は、各ログ行に対して実行される操作の数が制限されている一方で、月次および年次の集計を簡単に計算できることです。