提交 bb4992ff 编写于 作者: 雪洛's avatar 雪洛

docs: update jql-cache, cloudobject

上级 bbe4f2d4
......@@ -26,6 +26,7 @@
* [数据库操作符](uniCloud/cf-database-dbcmd.md)
* [数据库运算方法](uniCloud/cf-database-aggregate-operator.md)
* [JQL语法](uniCloud/jql.md)
* [缓存JQL查询结果](uniCloud/jql-cache-redis.md)
* [客户端通过JQL操作数据库](uniCloud/clientdb.md)
* [云函数通过JQL操作数据库](uniCloud/jql-cloud.md)
* [unicloud-db前端组件](uniCloud/unicloud-db.md)
......
......@@ -570,54 +570,13 @@ const res = await todo.add('title demo', 'content demo')
> 新增于HBuilderX 3.5.2
配置方式和云函数一致,相关文档:[定时触发器](uniCloud/trigger.md)
配置完成后会触发云对象导出的`_timing`方法
云对象代码示例:
```js
module.exports = {
_timing: function () {
console.log('triggered by timing')
}
}
```
**注意**
- 定时触发云对象时,`_before``_after`均不执行
详细用法参考:[云对象使用定时触发](uniCloud/trigger.md?id=cloudobject)
### url化@http-trigger
> 新增于HBuilderX 3.5.2
配置方式和云函数一致,相关文档:[url化](uniCloud/http.md)
在url化的文档里面有关于云函数url化时,event.path的说明
>url化场景下,event.path表示以配置的url化路径为根路径的访问路径。以配置`/test`为云函数url化路径,访问`/test/a/b/c`时event.path为`/a/b/c`
调用url化的云对象时,event.path对应的部分必须是云对象导出的方法名。例如:云对象配置的触发路径是`/todo`,调用`/todo/addTodo`即会触发云对象的addTodo方法。方法区分大小写且不可含`/`
url内query部分会被转换成云对象方法的入参。以下面的todo云对象为例
```js
module.exports = {
addTodo: function(params) {
console.log(params)
}
}
```
如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,怎todo方法内的console.log会输出以下内容`{title: 'todo title', content: 'todo content'}`
需要注意的是自url内解析出的参数均为字符串类型。
**注意**
- url化方式调用云对象时,`_before``_after`均正常执行
- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](#get-http-info)获取
详细用法参考:[云对象使用url化](uniCloud/http.md?id=cloudobject)
### 跨服务空间调用云对象@call-by-cloud-cross-space
......
......@@ -351,3 +351,30 @@ exports.main = function() {
}
}
```
### 云对象使用url化@cloudobject
配置方式和云函数一致,请参阅上方章节
> 在云函数url化场景下,event.path表示以配置的url化路径为根路径的访问路径。以配置`/test`为云函数url化路径,访问`/test/a/b/c`时event.path为`/a/b/c`
调用url化的云对象时,event.path对应的部分必须是云对象导出的方法名。例如:云对象配置的触发路径是`/todo`,调用`/todo/addTodo`即会触发云对象的addTodo方法。方法区分大小写且不可含`/`
url内query部分会被转换成云对象方法的入参。以下面的todo云对象为例
```js
module.exports = {
addTodo: function(params) {
console.log(params)
}
}
```
如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,怎todo方法内的console.log会输出以下内容`{title: 'todo-title', content: 'todo-content'}`
需要注意的是自url内解析出的参数均为字符串类型。
**注意**
- url化方式调用云对象时,`_before``_after`均正常执行
- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](uniCloud/cloud-obj.md?id=get-http-info)获取
\ No newline at end of file
> 新增于HBuilderX 3.5.2,需先开通[redis](uniCloud/redis-introduction.md)
业务中经常遇到不常改动或不需要及时更新的数据,此时如果每次都去数据库读取会浪费数据库读写次数,并且会增加云函数运行时间导致云函数整体能处理的请求数量变低。为了应对这种情况,jql支持了将配置的查询指令的结果缓存在redis内的功能。
详细用法如下
1. 在插件市场导入`uni-config-center`插件,插件地址:[uni-config-center](https://ext.dcloud.net.cn/plugin?id=4425)
2.`uniCloud/cloudfunction/common/uni-config-center`下创建`uni-jql-cache-redis.json`文件(注意此文件是标准json格式,不支持注释)
整个`uni-jql-cache-redis.json`文件是一个数组,其中每一项是一个缓存配置。示例内容如下
```js
[{
"id": "test-get", // 缓存id
"jql": "db.collection('test').limit(10).get()", // 要缓存的数据库指令
"expiresIn": 3600 // 缓存有效期
}]
```
3. 配置成功后与配置匹配的clientDB请求及使用jql扩展库的数据库查询会优先使用redis缓存(第一次调用匹配的查询语句时会先设置一次缓存)
未命中缓存时,clientDB或使用了jql扩展的云函数云函数会输出以下日志
```js
"当前请求需使用Redis缓存"
"返回Redis内缓存的结果"
```
命中缓存时,clientDB或使用了jql扩展的云函数云函数会输出以下日志
```js
"当前请求需使用Redis缓存"
"未命中Redis缓存,设置Redis缓存"
```
**缓存生效场景**
- 所有clientDB查询请求
- 启用redis扩展和jql扩展的云函数内的jql数据库查询请求
- unicloud-db组件的查询请求
jql会将缓存配置对应的查询结果缓存到key为`unicloud:jql-cache:${id}:string`redis缓存内
## multiSend使用缓存@multi-send
使用multiSend同时发送多条指令时,不支持将整个multiSend进行缓存。需要单独缓存每条指令。
例:
```js
const book = db.collection('book').limit(10).getTemp()
const author = db.collection('author').limit(10).getTemp()
db.multiSend(book,author)
```
对上述数据库指令不能直接将缓存配置中的jql配置为`const book = db.collection('book').limit(10).getTemp();const author = db.collection('author').limit(10).getTemp();db.multiSend(book,author)`
需要单独配置book表的查询语句和author表的查询语句,注意getTemp方法也需要改为get方法
```js
[{
"id": "book-get",
"jql": "db.collection('book').limit(10).get()",
"expiresIn": 3600
}, {
"id": "author-get",
"jql": "db.collection('author').limit(10).get()",
"expiresIn": 3600
}]
```
## 联表查询@lookup
联表时配置的缓存语句也和jql语法一致
例:
```js
const book = db.collection('book').limit(10).getTemp()
const author = db.collection('author').getTemp()
db.collection(book, author).get()
```
缓存配置如下
```js
[{
"id": "book-author-lookup",
"jql": "const book = db.collection('book').limit(10).getTemp();const author = db.collection('author').getTemp();db.collection(book, author).get()",
"expiresIn": 3600
}]
```
## 删除redis缓存@del-cache
使用redis删除命令传入缓存对应的key即可删除缓存
例:
```js
const redis = uniCloud.redis()
const id = 'book-author-lookup'
const cacheKey = `unicloud:jql-cache:${id}:string`
await redis.del(cacheKey)
```
## 注意事项
- 仅可缓存查询指令
- 注意id为缓存唯一id,不可与其他项重复
- 不可缓存使用了`db.getCloudEnv()``$cloudEnv_`开头的云端环境变量的查询
- 不可缓存使用了action的查询
- 不配置`expiresIn`时数据将会持久保存在redis内
- 启用jql扩展库的云函数同时也要启用redis扩展库才可以正常使用缓存功能,否则依然从数据库查询
\ No newline at end of file
......@@ -3351,33 +3351,6 @@ module.exports = {
- action上传后可能需要一段时间才会在云端生效,通常是3分钟左右
## 缓存JQL结果到Redis内@redis-cache
> 新增于HBuilderX 3.5.2
用于缓存业务中不常改动或不需要及时更新的数据,如新闻热点等。详细用法如下
1. 在插件市场导入`uni-config-center`插件,插件地址:[uni-config-center](https://ext.dcloud.net.cn/plugin?id=4425)
2.`uniCloud/cloudfunction/common/uni-config-center`下创建`uni-jql-cache-redis.json`文件(注意此文件是标准json格式,不支持注释)
整个`uni-jql-cache-redis.json`文件是一个数组,其中每一项是一个缓存配置。示例内容如下
```js
[{
"id": "test-get", // 缓存id
"jql": "db.collection('test').limit(10).get()", // 要缓存的数据库指令
"expiresIn": 3600 // 缓存有效期
}]
```
**注意**
- 注意id为缓存唯一id,不可与其他项重复
- jql会将缓存配置对应的查询结果缓存到key为`unicloud:jql-cache:${id}:string`redis缓存内
- 目前不可缓存使用了`db.getCloudEnv()``$cloudEnv_`开头的云端环境变量的查询
- 不可缓存使用了action的查询
- 不配置expiresIn时数据将会持久保存在redis内
## 数据库运算方法列表@aggregate-operator
uniCloud的云数据库,提供了一批强大的运算方法。这些方法是数据库执行的,而不是云函数执行的。
......
......@@ -102,3 +102,26 @@ Cron 表达式有七个**必需**字段,按空格分隔。其中,每个字
"timestamp": 1585670400006 //触发云函数时的时间戳,可能略晚于cron表达式时间
}
```
### 云对象使用定时触发@cloudobject
> 新增于HBuilderX 3.5.2
配置方式和云函数一致,请参阅上方章节
配置完成后会触发云对象导出的`_timing`方法
云对象代码示例:
```js
module.exports = {
_timing: function () {
console.log('triggered by timing')
}
}
```
**注意**
- 定时触发云对象时,`_before``_after`均不执行
- 定时触发云对象时`_timing`方法不会收到任何参数
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册