68 lines
2.2 KiB
TypeScript
68 lines
2.2 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++) {
|
|
const score = parseInt(records[i].count * 100 + '')
|
|
let totalScoreStr = await new ZRedisClient().zscore(totalKey, records[i]._id)
|
|
let totalScore = parseInt(totalScoreStr + '')
|
|
if (score != totalScore) {
|
|
if (Math.abs(score - totalScore) > 1) {
|
|
console.log(`user: ${records[i]._id}, score: ${score}, redis: ${totalScore}`)
|
|
await new ZRedisClient().zincrby(totalKey, score - totalScore, records[i]._id)
|
|
}
|
|
}
|
|
if (i % 1000 === 0) {
|
|
console.log(i)
|
|
}
|
|
}
|
|
console.timeEnd('first')
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
console.log('end')
|
|
process.exit(0)
|
|
})()
|