UNPKG

request-limit

Version:

通过redis缓存实现token对url的访问频率控制

54 lines (49 loc) 1.64 kB
'use strict' // const MemoryStore = require('./memory_store') const redisStore = require('./redis') const crypto = require('crypto') class Store { constructor(options) { this.client = redisStore(options) } async genKey(key) { const hashKey = crypto.createHash('sha256').update(key).digest('hex') return hashKey } async ready() { return new Promise((resolve, reject) => { this.client.on('ready', (err) => { if (err) { console.warn('redis error: ', err.message) reject(err) } else { console.log('redis success!!!') resolve(this.client) } }) }) } async getTimes({key, interval}) { const hashKey = await this.genKey(key, interval) const times = await this.client.redisGet(hashKey) return parseInt(times || '0', 10) } async record({key, interval}) { const hashKey = await this.genKey(key, interval) try { const times = await this.client.redisGet(hashKey) if (!times) { await this.client.redisSet(hashKey, '0') await this.client.redisExpire(hashKey, interval) } await this.client.redisIncrby(hashKey, 1) return this.client.redisGet(key) } catch (err) { console.warn('record error: ', err.message) } } async del(key) { await this.client.redisDel(key) } } module.exports = Store