diff --git a/src/analytics.js b/src/analytics.js index c2d0a010e1..4561e9519f 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -87,10 +87,19 @@ Analytics.pageView = async function (payload) { } }; +function sortedSetIncrByBulk(data) { + if ('sortedSetIncrByBulk' in db) { + return db.sortedSetIncrByBulk(data); + } + const queue = data.map(([key, increment, value]) => db.sortedSetIncrBy(key, increment, value)); + return Promise.all(queue); +} + Analytics.writeData = async function () { const today = new Date(); const month = new Date(); const dbQueue = []; + const incrByBulk = []; // Build list of metrics that were updated let metrics = [ @@ -108,31 +117,31 @@ Analytics.writeData = async function () { month.setHours(0, 0, 0, 0); if (pageViews > 0) { - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews', pageViews, today.getTime())); - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month', pageViews, month.getTime())); + incrByBulk.push(['analytics:pageviews', pageViews, today.getTime()]); + incrByBulk.push(['analytics:pageviews:month', pageViews, month.getTime()]); pageViews = 0; } if (pageViewsRegistered > 0) { - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:registered', pageViewsRegistered, today.getTime())); - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:registered', pageViewsRegistered, month.getTime())); + incrByBulk.push(['analytics:pageviews:registered', pageViewsRegistered, today.getTime()]); + incrByBulk.push(['analytics:pageviews:month:registered', pageViewsRegistered, month.getTime()]); pageViewsRegistered = 0; } if (pageViewsGuest > 0) { - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:guest', pageViewsGuest, today.getTime())); - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:guest', pageViewsGuest, month.getTime())); + incrByBulk.push(['analytics:pageviews:guest', pageViewsGuest, today.getTime()]); + incrByBulk.push(['analytics:pageviews:month:guest', pageViewsGuest, month.getTime()]); pageViewsGuest = 0; } if (pageViewsBot > 0) { - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:bot', pageViewsBot, today.getTime())); - dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:bot', pageViewsBot, month.getTime())); + incrByBulk.push(['analytics:pageviews:bot', pageViewsBot, today.getTime()]); + incrByBulk.push(['analytics:pageviews:month:bot', pageViewsBot, month.getTime()]); pageViewsBot = 0; } if (uniquevisitors > 0) { - dbQueue.push(db.sortedSetIncrBy('analytics:uniquevisitors', uniquevisitors, today.getTime())); + incrByBulk.push(['analytics:uniquevisitors', uniquevisitors, today.getTime()]); uniquevisitors = 0; } @@ -142,11 +151,15 @@ Analytics.writeData = async function () { } for (const [key, value] of Object.entries(counters)) { - dbQueue.push(db.sortedSetIncrBy(`analytics:${key}`, value, today.getTime())); + incrByBulk.push([`analytics:${key}`, value, today.getTime()]); metrics.push(key); delete counters[key]; } + if (incrByBulk.length) { + dbQueue.push(sortedSetIncrByBulk(incrByBulk)); + } + // Update list of tracked metrics dbQueue.push(db.sortedSetAdd('analyticsKeys', metrics.map(() => +Date.now()), metrics));