问题背景
对于一些变化性不强但可能多次使用的数据(如一些列表、文章信息等),如果每次都进行网络请求,不仅减慢了速度,也加重了服务器负担;这时往往需要通过 setStorage
和 getStorage
进行本地缓存,但也存在一些问题,一个是 storage
只能通过 key-value
的形式进行管理,无法进行更复杂的数据库操作,另外每次都从本地 storage
中读写效率不高
改进方式
- 改进读写方式
在init
的时候读取本地storage
,之后所有读写都在这个变量中进行操作,不必每次读取本地storage
;在进行写入操作后,定期写回本地storage
,也可以减少写入次数 - 存储结构
一个集合由一个object
组成,里面的每一个键值对表示一个记录,通过id
查询效率高(id
可以自动生成,默认为4
位由数字字母组成的随机值),通过where
查询则需要遍历 - 实现数据库的 api
为减少上手难度,所有api
都参照了 云数据库 的设置,几乎所有的方法都可以直接使用(但由于本地数据库存取都较快,所有方法都是同步方法,直接返回结果),通过这些api
,可以大大便利数据的查询和设置
例程
const localDB = require('utils/localDB.js')
const _ = localDB.command
localDB.init() // 初始化
var articles = localDB.collection('articles')
if(!articles)
articles = localDB.createCollection('articles') // 不存在则先创建
// 按文章 id 查找
var doc = articles.doc('xxx')
if(doc) {
var data = doc.get() // 取得数据
} else {
// 网络请求获取 data
data._timeout = Date.now() + 15 * 24 * 3600000 // 设置过期时间为 15 天
articles.add(data) // 添加到本地数据库
}
// 按类型查找
var data = articles.where({
type: 'xxx'
}).get()
// 正则查找
var data = articles.where({
title: /xxx/ // 标题中含有 xxx 的
}).get()
// 分页查找
var page2 = articles.skip(10).limit(10).get()
// 按时间查找
var data = articles.where({
date: _.gte('20200501').and(_.lte('20200510')) // 大于等于 20200501 小于等于 20200510
}).get()
// 结果排序
var data = articles.orderBy('date', 'desc').get() // 按日期降序排序
// 清理过期数据
articles.where({
_timeout: _.lt(Date.now()) // 过期时间早于当前的
}).remove()
请问,单key,会有1M空间的上限吗?
赞,很棒,向你学习
不错,赞一个
赞。像 CSharp的DataTable。
不错,赞一个