import mongoose from 'mongoose' import * as dotenv from 'dotenv' const envFile = process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? `.env.production` : '.env.development' dotenv.config({ path: envFile }) console.log(process.env.DB_MAIN) import { ActivityChest } from 'models/ActivityChest' import { ScoreRecord } from 'models/ScoreRecord' import { DeleteRecord } from 'models/DeleteRecord' import { rankKey, updateRank, updateRankInvite } from 'services/rank.svr' import { ZRedisClient } from 'zutils' import { RANK_SCORE_SCALE } from 'common/Constants' const db = mongoose.connection const totalKey = 'uaw_activity:score' const keyInvite = `uaw_activity:invite` const updateRedis = async (activity, user, score) => { await updateRank(totalKey, score, user) } const updateRedisInvite = async (activity, sourceUser, user, score) => { await updateRankInvite(keyInvite, parseInt(score * RANK_SCORE_SCALE + ''), `${sourceUser}_${user}`) } const updateRedis2 = (key, vals) => { return new Promise((resolve, reject) => { new ZRedisClient().pub.zadd(key, vals, function (err, res) { if (err) { reject(err) } else { resolve(res) } }) }) } ;(async () => { try { let records = await ScoreRecord.aggregate([{ $group: { _id: '$user', count: { $sum: '$score' } } }]) console.time('first') // _id, count console.log('records: ', records.length) let opts = { url: process.env.REDIS } new ZRedisClient(opts) let vals = [] for (let i = 0, l = records.length; i < l; i++) { vals.push((records[i].count * 100) | 0) vals.push(records[i]._id) if (i % 1000 === 0) { await updateRedis2(totalKey, vals) vals.length = 0 } } if (vals.length > 0) { await updateRedis2(totalKey, vals) } console.timeEnd('first') let records2 = await ScoreRecord.aggregate([ { $match: { type: 'invite_rebate' } }, { $group: { _id: { user: '$user', from: '$data.fromUser', }, count: { $sum: '$score' }, }, }, ]) console.time('second') // _id, count console.log('records2: ', records2.length) let vals2 = [] for (let i = 0, l = records.length; i < l; i++) { vals2.push((records[i].count * 100) | 0) vals2.push(`${records[i]._id.from}_${records[i]._id.user}`) if (i % 1000 === 0) { await updateRedis2(keyInvite, vals2) vals2.length = 0 } } if (vals2.length > 0) { await updateRedis2(keyInvite, vals2) } console.timeEnd('second') } catch (e) { console.log(e) } console.log('end') process.exit(0) })()