task-svr/src/repairredis.ts
2024-04-24 18:57:29 +08:00

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)
})()