昨天分享了基于云开发实现 KV 缓存的办法,但在理论的开发过程中,这样的性能其实很难满足所有的需要。在这个时候,就须要对原有的计划进行优化,来解决一些其余的问题。
具体来说,之前的代码有以下几个问题:
- 没有进行错误处理
- 没有对数据进行过期工夫的解决
- 如果没有数据的话,如何触发数据更新
这些都没有在昨天的文章中提及,明天就补全这些局部。
对数据进行错误处理
在应用云开发的时候,是有出错的可能的,因而,咱们须要对可能出错的局部进行解决,以确保函数自身是能够失常返回的。
咱们须要在原有的函数中进行批改,批改后的后果如下
设置缓存
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
就能够实现相应的解决。
设置缓存
对设定缓存的函数退出一个新的可选参数,来设定缓存过期工夫。未设定缓存过期工夫的状况下,你能够缓存 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 } }}
总结
在明天的文章中,咱们通过一些简略的解决,实现了缓存函数的三步优化,别离退出了缓存解决、过期工夫和自动更新,让缓存能够变得更好用。
那么问题来了,你感觉这个缓存零碎还有什么能够优化的点么?