1. 首页
  2. 小程序

基于云开发搭建 KV 缓存系统 2.0

昨天分享了基于云开发实现 KV 缓存的方法,但在实际的开发过程中,这样的功能其实很难满足所有的需求。在这个时候,就需要对原有的方案进行优化,来解决一些其他的问题。

具体来说,之前的代码有以下几个问题:

  1. 没有进行错误处理
  2. 没有对数据进行过期时间的处理
  3. 如果没有数据的话,如何触发数据更新

这些都没有在昨天的文章中提及,今天就补全这些部分。

对数据进行错误处理

在使用云开发的时候,是有出错的可能的,因此,我们需要对可能出错的部分进行处理,以确保函数本身是可以正常返回的。

我们需要在原有的函数中进行修改,修改后的结果如下

设置缓存

JS中文网 – 前端进阶资源教程 https://www.javascriptc.com/
一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容


async function setCache(key, value) { try { let result = await db.collection("cache").add({ data: { _id: key, value: value } }) return { code:0 } } catch (error) { return { code:1, msg: error } } }

读取缓存


async function getCache(key) { try { let { data } = await db.collection("cache").doc(key).get(); return { code: 0, value: data.value }; } catch (error) { return { code: 1, msg: error } } }

通过这一轮的修改,我们在原有的函数基础之上添加了错误处理,无论如何,缓存函数本身不会报错,不会阻塞外部逻辑的执行。在外部逻辑侧只需要根据返回的 code 来进行判断是获取缓存,还是直接进行逻辑计算,完成所有的工作。

对数据进行过期时间的处理

在前一个版本中,我们加入了错误处理,但还是没有解决一个问题,那就是数据的过期逻辑。但缓存在实际使用过程中,是存在过期的可能,既然存在过期,我们就需要在缓存中,实现相应的过期逻辑的处理。

想要实现,成本倒也不高,你只需要在数据中加一个过期时间字段expiredAt就可以完成相应的处理。

基于云开发搭建 KV 缓存系统 2.0

设置缓存

对设定缓存的函数加入一个新的可选参数,来设定缓存过期时间。未设定缓存过期时间的情况下,你可以缓存 3600 秒(一小时)。


async function setCache(key, value,expire_time = 3600) { try { let expired_time = (new Date()) + expire_time * 1000 let result = await db.collection("cache").add({ data: { _id: key, value: value, expiredAt: expired_time } }) return { code:0 } } catch (error) { return { code:1, msg: error } } }

读取缓存

类似的,在缓存中加入相应的配置,可以完成缓存过期的处理


async function getCache(key) { try { let { data } = await db.collection("cache").doc(key).get(); let current = (new Date()).valueOf(); if (data.expiredAt < current) { return { code:1, msg: "Cache expired" } } return { code: 0, value: data.value }; } catch (error) { return { code: 1, msg: error } } }

如何触发数据的更新

在上一个版本中,我们完成了数据的过期,但目前数据的过期后处理是由业务逻辑来完成的,我们有没有办法在缓存过期的时候,进行相应的触发,从而主动更新缓存,这样可以确保缓存接口始终可以拿到数据?

也可以。我们可以再新增一个参数来完成。这一部分主要影响的是获取 Cache 的部分,所以,设置缓存和上一个版本相同。

设置缓存


async function setCache(key, value,expire_time = 3600) { try { let expired_time = (new Date()) + expire_time * 1000 let result = await db.collection("cache").add({ data: { _id: key, value: value, expiredAt: expired_time } }) return { code:0 } } catch (error) { return { code:1, msg: error } } }

获取缓存

获取缓存时,我们需要能够实现相应的数据更新的能力,因此,我们需要新增一个参数,来完成数据更新的部分。新的参数中我们需要传入一个函数,这个函数将会执行数据更新逻辑,将数据


async function getCache(key,uploadFunction) { try { let { data } = await db.collection("cache").doc(key).get(); let current = (new Date()).valueOf(); if (data.expiredAt < current) { if(uploadFunction){ const data = uploadFunction(); setCache(key,data) return { code:0, value: data } } return { code:1, msg: "Cache expired" } } return { code: 0, value: data.value }; } catch (error) { return { code: 1, msg: error } } }

总结

在今天的文章中,我们通过一些简单的处理,完成了缓存函数的三步优化,分别加入了缓存处理、过期时间和自动更新,让缓存可以变得更好用。

那么问题来了,你觉得这个缓存系统还有什么可以优化的点么?

作者:白宦成
链接:https://segmentfault.com/a/1190000025186952

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:基于云开发搭建 KV 缓存系统 2.0

链接:https://www.javascriptc.com/4347.html

« 漫画 | 夜深了,程序员的电脑却没关,发生了这样的故事…
漫画 | 小公司卧薪尝胆三年,意外拿到美团offer»
Flutter 中文教程资源

相关推荐

QR code