94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
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)
|
|
})()
|