内部数据库

平台自带Redis缓存数据库和关系型数据库PostgreSQL,接下来的篇幅都是讨论把此Postgres作为业务数据库的知识。想自建数据库存放业务数据的请阅读上一篇【外部数据库】。

$c

数据库操作返回的数据都会放入$c对应的表名下面,比如通过$c.product[id].x.title可以拿到标题。特别地,当前登录用户数据除了放入$c.user还会放入$c.me。在开发模式下我们可以在开发者工具的控制台上用log($c)把所有数据打印出来。

新的数据库操作会影响原先获得的数据。get()、update()、find()返回的数据会合并到对应的旧数据中;delete()会删除对应的旧数据,也会删除find()返回数组中的对应数据。提示:依次删除此数组项会导致不稳定:$c.商品s.forEach("$proudct.delete(id)"),因为每删除一次平台都会删除数组里对应的数据项从而改变数组长度。把数组先克隆再循环就没问题了:$c.商品s.clone().forEach("$proudct.delete(id)")

缓存

接口调用需要花费时间、网络、服务器和数据库资源,平台是据此来收取流量费的,我们应尽量减少查询接口调用的次数和频次,不做无谓的消耗。非查询接口不涉及缓存。
在浏览器端平台会自动缓存从服务器获取的资源,以最大限度节省流量费。当一个接口已被缓存后再次以完全一样的参数调用时平台将直接从浏览器缓存读取而跳过接口调用,如果不想要缓存而总是从服务器端获取数据可以传入0作为cache参数。cache也可以传入大于0的小时数(范围:0.1 ~ 5)来指示服务器把查询的结果缓存起来,(其他用户的)在这个缓存时间内以完全一样的参数调用此接口就可以直接从缓存中读取,从而大大提高查询速度。
总结:默认(无cache参数时)仅浏览器端缓存,cache为0时都不缓存,大于0时服务器端缓存(浏览器当然也缓存)。

一个接口请求发出去需要一段数据才能从服务器端返回来,所以应该避免在极短的时间内多次触发完全相同的接口(接口名、参数数量和参数值都相同)。为此平台会自动跳过3秒内触发的完全相同的接口,而等待最近触发的接口返回后才继续执行后续表达式。

可以通过clearCache(path)清除前端缓存,$api.clearCache(path)清除服务器端缓存。
传入path只清除指定路径的缓存,未传入则会清除所有缓存(由数据库search,count,distinct,aggregate接口留下的缓存)。

数据安全控制

对于一个严肃的应用,加强数据安全控制是值得高度重视的。虽然在每个应用在创建时都预设了基础安全控制,但还是远远不够的。请到接口安全文档中学习。

由众触低代码平台生成和驱动