incr by bulk. (#9952)

* incr by bulk.

* Update analytics.js

* Update analytics.js

* lint: fix

Co-authored-by: Barış Soner Uşaklı <baris@nodebb.org>
Co-authored-by: Barış Soner Uşaklı <barisusakli@gmail.com>
isekai-main
sadaszewski 3 years ago committed by GitHub
parent 6ea3b51f12
commit a1c9a69cd3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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 () { Analytics.writeData = async function () {
const today = new Date(); const today = new Date();
const month = new Date(); const month = new Date();
const dbQueue = []; const dbQueue = [];
const incrByBulk = [];
// Build list of metrics that were updated // Build list of metrics that were updated
let metrics = [ let metrics = [
@ -108,31 +117,31 @@ Analytics.writeData = async function () {
month.setHours(0, 0, 0, 0); month.setHours(0, 0, 0, 0);
if (pageViews > 0) { if (pageViews > 0) {
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews', pageViews, today.getTime())); incrByBulk.push(['analytics:pageviews', pageViews, today.getTime()]);
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month', pageViews, month.getTime())); incrByBulk.push(['analytics:pageviews:month', pageViews, month.getTime()]);
pageViews = 0; pageViews = 0;
} }
if (pageViewsRegistered > 0) { if (pageViewsRegistered > 0) {
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:registered', pageViewsRegistered, today.getTime())); incrByBulk.push(['analytics:pageviews:registered', pageViewsRegistered, today.getTime()]);
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:registered', pageViewsRegistered, month.getTime())); incrByBulk.push(['analytics:pageviews:month:registered', pageViewsRegistered, month.getTime()]);
pageViewsRegistered = 0; pageViewsRegistered = 0;
} }
if (pageViewsGuest > 0) { if (pageViewsGuest > 0) {
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:guest', pageViewsGuest, today.getTime())); incrByBulk.push(['analytics:pageviews:guest', pageViewsGuest, today.getTime()]);
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:guest', pageViewsGuest, month.getTime())); incrByBulk.push(['analytics:pageviews:month:guest', pageViewsGuest, month.getTime()]);
pageViewsGuest = 0; pageViewsGuest = 0;
} }
if (pageViewsBot > 0) { if (pageViewsBot > 0) {
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:bot', pageViewsBot, today.getTime())); incrByBulk.push(['analytics:pageviews:bot', pageViewsBot, today.getTime()]);
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:bot', pageViewsBot, month.getTime())); incrByBulk.push(['analytics:pageviews:month:bot', pageViewsBot, month.getTime()]);
pageViewsBot = 0; pageViewsBot = 0;
} }
if (uniquevisitors > 0) { if (uniquevisitors > 0) {
dbQueue.push(db.sortedSetIncrBy('analytics:uniquevisitors', uniquevisitors, today.getTime())); incrByBulk.push(['analytics:uniquevisitors', uniquevisitors, today.getTime()]);
uniquevisitors = 0; uniquevisitors = 0;
} }
@ -142,11 +151,15 @@ Analytics.writeData = async function () {
} }
for (const [key, value] of Object.entries(counters)) { 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); metrics.push(key);
delete counters[key]; delete counters[key];
} }
if (incrByBulk.length) {
dbQueue.push(sortedSetIncrByBulk(incrByBulk));
}
// Update list of tracked metrics // Update list of tracked metrics
dbQueue.push(db.sortedSetAdd('analyticsKeys', metrics.map(() => +Date.now()), metrics)); dbQueue.push(db.sortedSetAdd('analyticsKeys', metrics.map(() => +Date.now()), metrics));

Loading…
Cancel
Save