diff --git a/src/api.server.ts b/src/api.server.ts index 41ac70f..40176ff 100644 --- a/src/api.server.ts +++ b/src/api.server.ts @@ -10,6 +10,7 @@ import logger from 'logger/logger' import { RedisClient } from 'redis/RedisClient' import NonceRecordSchedule from 'schedule/noncerecord.schedule' import { SyncLocker } from 'common/SyncLocker' +import CacheSchedule from 'schedule/cache.schedule' const zReqParserPlugin = require('plugins/zReqParser') @@ -106,6 +107,7 @@ export class ApiServer { logger.log('REDIS Connected') } private initSchedules() { + new CacheSchedule().scheduleAll() new NonceRecordSchedule().scheduleAll() } diff --git a/src/common/LotteryCache.ts b/src/common/LotteryCache.ts index 83ee02a..26a069a 100644 --- a/src/common/LotteryCache.ts +++ b/src/common/LotteryCache.ts @@ -2,9 +2,11 @@ import { singleton } from "decorators/singleton"; import { LotteryStats } from "models/LotteryStats"; import { formatDate } from "utils/date.util"; +const EXPIRE_TIME = 1000 * 60 * 60; @singleton export class LotteryCache { map: Map = new Map(); + lastUsed: Map = new Map(); public async getData(user: string, activity: string) { const dateTag = formatDate(new Date()); @@ -12,11 +14,19 @@ export class LotteryCache { const record = await LotteryStats.insertOrUpdate({user, activity, dateTag}, {}) this.map.set(user+dateTag, record); } + this.lastUsed.set(user+dateTag, Date.now()); return this.map.get(user+dateTag); } public async flush() { - for (let record of this.map.values()) { - await record.save(); + for (let [key, record] of this.map.entries()) { + // record.modifiedPaths() + if (record.isModified()) { + await record.save(); + } + if (Date.now() - this.lastUsed.get(key) > EXPIRE_TIME) { + this.map.delete(key); + this.lastUsed.delete(key); + } } } } \ No newline at end of file diff --git a/src/schedule/cache.schedule.ts b/src/schedule/cache.schedule.ts new file mode 100644 index 0000000..e9c5c1e --- /dev/null +++ b/src/schedule/cache.schedule.ts @@ -0,0 +1,26 @@ +import { LotteryCache } from 'common/LotteryCache'; +import { singleton } from 'decorators/singleton' +import logger from 'logger/logger'; +import {NonceRecord} from 'models/NonceRecord' +import * as schedule from 'node-schedule' + +/** + * 定时更新发送邮件验证码的过期状态 + */ +@singleton +export default class CacheSchedule { + + async updateCache() { + try { + new LotteryCache().flush(); + } catch (err) { + logger.warn(err) + } + + } + scheduleAll() { + schedule.scheduleJob('*/10 * * * * *', async () => { + await this.updateCache() + }) + } +}