egg-recachegoose
本插件用于eggjs生态,结合redis
和mongoose
,实现对查询结果的缓存。
依赖的 egg 版本
egg-validate 版本 | egg 1.x |
---|---|
1.x | |
0.x |
依赖的插件
您需要在项目中安装并启用如下插件,本插件才能正常工作。
- egg-redis
- egg-mongoose
开启插件
// config/plugin.js
exports.recachegoose = {
enable: true,
package: '@unode/egg-recachegoose'
}
详细配置
请到 config/config.default.js 查看详细配置项说明。
exports.recachegoose = {
// 缓存的时间,单位秒
ttl: 60,
// 在redis中的前缀,为了避免和其他键造成冲突
keyPrefix: 'recachegoose'
}
使用方法
- 对查询结果使用
cache()
方法进行缓存,如不调用此方法,则默认不缓存。
// controller/home.js
const {ctx} = this
// 对查询结果缓存100秒
const res = await ctx.model.User.find({}).cache(100)
- 由于缓存缓存了结果,下一次通用的查询条件将会优先从缓存中取出结果,会造成一些问题,比如过程中有新的记录产生,或者被删除,修改等,那么缓存中的结果就不会是最新的,所以插件提供了一个方法,在表中有数据变动时,会直接清空该表中相关的缓存结果。
// app/model/user.js
module.exports = (app) => {
const mongoose = app.mongoose
const Schema = mongoose.Schema
const modelName = 'user'
const table = new Schema({
userName: {
type: String,
default: ''
}
})
// 通过clear参数(数组),对指定的操作发生时进行清空本表的缓存
// modelName参数必填,用于表明本表的名称
table.plugin(app.recachegoose.autoClearCache, { modelName, clear: ['update', 'delete', 'add'] })
return mongoose.model(modelName, table, modelName)
}
当然,您也可以在service
中通过调用插件的方法,手动清空缓存,如下:
// 清空某个表的缓存,下为user表
app.recachegoose.clearCache('user:*')
// 清空某个已知名称的缓存键,一般用不到
app.recachegoose.clearCache('xxx')