# egg-recachegoose


本插件用于[eggjs](https://www.npmjs.com/package/egg)生态，结合`redis`和`mongoose`，实现对查询结果的缓存。


### 依赖的 egg 版本

egg-validate 版本 | egg 1.x
--- | ---
1.x | 😁
0.x | ❌

### 依赖的插件

您需要在项目中安装并启用如下插件，本插件才能正常工作。

- egg-redis
- egg-mongoose


## 开启插件

```js
// config/plugin.js
exports.recachegoose = {
  enable: true,
  package: '@unode/egg-recachegoose'
}
```

## 详细配置

请到 [config/config.default.js](config/config.default.js) 查看详细配置项说明。

```js
exports.recachegoose = {
    // 缓存的时间，单位秒
    ttl: 60,
    // 在redis中的前缀，为了避免和其他键造成冲突
    keyPrefix: 'recachegoose'
}
```

## 使用方法

1. 对查询结果使用`cache()`方法进行缓存，如不调用此方法，则默认不缓存。

```js
// controller/home.js
const {ctx} = this
// 对查询结果缓存100秒
const res = await ctx.model.User.find({}).cache(100)
```

2. 由于缓存缓存了结果，下一次通用的查询条件将会优先从缓存中取出结果，会造成一些问题，比如过程中有新的记录产生，或者被删除，修改等，那么缓存中的结果就不会是最新的，所以插件提供了一个方法，在表中有数据变动时，会直接清空该表中相关的缓存结果。

```js
// 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`中通过调用插件的方法，手动清空缓存，如下：

```js
// 清空某个表的缓存，下为user表
app.recachegoose.clearCache('user:*')

// 清空某个已知名称的缓存键，一般用不到
app.recachegoose.clearCache('xxx')
```

## License

[MIT](LICENSE)
