实现一个本地数据库
发布于 5 年前 作者 bwan 2056 次浏览 来自 分享

问题背景

对于一些变化性不强但可能多次使用的数据(如一些列表、文章信息等),如果每次都进行网络请求,不仅减慢了速度,也加重了服务器负担;这时往往需要通过 setStoragegetStorage 进行本地缓存,但也存在一些问题,一个是 storage 只能通过 key-value 的形式进行管理,无法进行更复杂的数据库操作,另外每次都从本地 storage 中读写效率不高

改进方式

  1. 改进读写方式
    init 的时候读取本地 storage,之后所有读写都在这个变量中进行操作,不必每次读取本地 storage;在进行写入操作后,定期写回本地 storage,也可以减少写入次数
  2. 存储结构
    一个集合由一个 object 组成,里面的每一个键值对表示一个记录,通过 id 查询效率高(id 可以自动生成,默认为 4 位由数字字母组成的随机值),通过 where 查询则需要遍历
  3. 实现数据库的 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()

github

MpLocalDB

3 回复

赞。像 CSharp的DataTable。

不错,赞一个

不错,赞一个

回到顶部