昨天分享了基于云开发实现 KV 缓存的方法,但在实际的开发过程当中,这样的功能其实很难知足全部的需求。在这个时候,就须要对原有的方案进行优化,来解决一些其余的问题。缓存
具体来讲,以前的代码有如下几个问题:async
这些都没有在昨天的文章中说起,今天就补全这些部分。函数
在使用云开发的时候,是有出错的可能的,所以,咱们须要对可能出错的部分进行处理,以确保函数自己是能够正常返回的。优化
咱们须要在原有的函数中进行修改,修改后的结果以下spa
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 来进行判断是获取缓存,仍是直接进行逻辑计算,完成全部的工做。3d
在前一个版本中,咱们加入了错误处理,但仍是没有解决一个问题,那就是数据的过时逻辑。但缓存在实际使用过程当中,是存在过时的可能,既然存在过时,咱们就须要在缓存中,实现相应的过时逻辑的处理。code
想要实现,成本倒也不高,你只须要在数据中加一个过时时间字段expiredAt
就能够完成相应的处理。blog
对设定缓存的函数加入一个新的可选参数,来设定缓存过时时间。未设定缓存过时时间的状况下,你能够缓存 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 } } }
在今天的文章中,咱们经过一些简单的处理,完成了缓存函数的三步优化,分别加入了缓存处理、过时时间和自动更新,让缓存能够变得更好用。
那么问题来了,你以为这个缓存系统还有什么能够优化的点么?