成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何構(gòu)建通用存儲(chǔ)中間層

hersion / 1838人閱讀

摘要:并且數(shù)據(jù)同步后默認(rèn)會(huì)保存下來(lái),這樣下次再請(qǐng)求時(shí)存儲(chǔ)層中就有數(shù)據(jù)了。以下參數(shù)會(huì)傳到中這么一來(lái),存儲(chǔ)層就和接口層對(duì)接起來(lái)了。五支持永久保存在某些場(chǎng)景下,可能不方便寫(xiě)過(guò)期時(shí)間,這時(shí)默認(rèn)可以傳遞,標(biāo)記該數(shù)據(jù)永不過(guò)期。

零、問(wèn)題的由來(lái)

開(kāi)門見(jiàn)山地說(shuō),這篇文章【又】是一篇安利軟文~,安利的對(duì)象就是 tua-storage。

顧名思義,這就是一款存儲(chǔ)數(shù)據(jù)的工具。

用 tua-storage 好處大大的有么?

那必須滴~,下面開(kāi)始我的表演~

多端統(tǒng)一 api

支持?jǐn)?shù)據(jù)同步

數(shù)據(jù)過(guò)期邏輯

自動(dòng)清理過(guò)期數(shù)據(jù)

支持永久保存

支持批量操作

一、多端統(tǒng)一 api

日常開(kāi)發(fā)中,在不同的平臺(tái)下由于有不同的存儲(chǔ)層接口,所以往往導(dǎo)致相同邏輯的同一份代碼要寫(xiě)幾份兒。

例如,小程序中保存數(shù)據(jù)要使用【異步】的 wx.setStorage、wx.getStorage 或?qū)?yīng)的同步方法;

而在 web 端使用 localStorage 的話,則是【同步】的 setItem、getItem 等方法;

在 React-Native 的場(chǎng)景下,使用的又是 AsyncStorage 中【異步】的 setItemgetItem...

1.1.異步方法

然而,經(jīng)過(guò) tua-storage 的二次封裝,以上兩個(gè)方法統(tǒng)一變成了:

save: 異步保存

load: 異步讀取

此外還有一些其他方法:

clear: 異步清除(刪除多個(gè))

remove: 異步刪除(刪除單個(gè))

getInfo: 異步獲取信息(如 keys

詳情參閱這里的文檔

1.2.同步方法

在某些場(chǎng)景下正好需要調(diào)用同步方法的話,咋辦咧?

與 Node.js 的 api 風(fēng)格差不多,在上述異步方法后面加上 Sync 就是對(duì)應(yīng)的同步方法:

saveSync

loadSync

clearSync

removeSync

getInfoSync

那么在 AsyncStorage 的場(chǎng)景下,壓根就沒(méi)有同步方法時(shí)調(diào)用以上方法會(huì)怎么樣呢?

嗯,你猜得沒(méi)錯(cuò),會(huì)直接報(bào)錯(cuò)...

1.3.區(qū)分場(chǎng)景
如何區(qū)分不同的場(chǎng)景呢?

在初始化的時(shí)候傳遞 storageEngine 即可:

import TuaStorage from "tua-storage"

const tuaStorage = new TuaStorage({
    // 小程序
    storageEngine: wx,

    // web
    storageEngine: localStorage,

    // React-Native
    storageEngine: AsyncStorage,

    // Node.js
    storageEngine: {},
})
注意:傳遞的是【對(duì)象】,而非字符串!
二、支持?jǐn)?shù)據(jù)同步

對(duì)于一個(gè)二次封裝多端存儲(chǔ)層的庫(kù)來(lái)說(shuō),保證多端 api 的統(tǒng)一僅僅是常規(guī)操作而已。

tua-storage 的另一大亮點(diǎn)就是數(shù)據(jù)同步功能。

想想平時(shí)我們是怎么使用存儲(chǔ)層的

讀取一個(gè)數(shù)據(jù)

正好存儲(chǔ)層里有這個(gè)數(shù)據(jù)

返回?cái)?shù)據(jù)(皆大歡喜,happy ending~)

假如存儲(chǔ)層里沒(méi)這個(gè)數(shù)據(jù)

手動(dòng)調(diào)用各種方法去同步這個(gè)數(shù)據(jù)

手動(dòng)存到存儲(chǔ)層中,以便下次讀取

各位有沒(méi)有看出其中麻煩的地方在哪兒?

數(shù)據(jù)同步部分的復(fù)雜度全留給了業(yè)務(wù)側(cè)。

讓我們回歸這件事的【初心】:我僅僅需要獲取這個(gè)數(shù)據(jù)!我不管它是來(lái)自存儲(chǔ)層、來(lái)自接口數(shù)據(jù)、還是來(lái)自其他什么地方...

2.1.數(shù)據(jù)同步函數(shù)

因此 tua-storage 在讀取數(shù)據(jù)時(shí)很貼心地提供了一個(gè) syncFn 參數(shù),作為數(shù)據(jù)同步的函數(shù),當(dāng)請(qǐng)求的數(shù)據(jù)不存在或已過(guò)期時(shí)自動(dòng)調(diào)用該函數(shù)。并且數(shù)據(jù)同步后默認(rèn)會(huì)保存下來(lái),這樣下次再請(qǐng)求時(shí)存儲(chǔ)層中就有數(shù)據(jù)了。

syncParams 的使用場(chǎng)景是接口需要傳參時(shí),這些參數(shù)會(huì)傳給 syncFn。

tuaStorage.load({
    key: "some data",
    syncFn: ({ a }) => axios("some api url" + a),
    // 以下參數(shù)會(huì)傳到 syncFn 中
    syncParams: { a: "a" },
})

這么一來(lái),存儲(chǔ)層就和接口層對(duì)接起來(lái)了。業(yè)務(wù)側(cè)再也不用手動(dòng)調(diào)用 api 獲取數(shù)據(jù)。

2.2.合并分散配置

每次讀取數(shù)據(jù)時(shí)如果都要手動(dòng)傳同步函數(shù),實(shí)際編碼時(shí)還是很麻煩...

不急,吃口藥~

tua-storage 在初始化時(shí)能夠傳遞一個(gè)叫做 syncFnMap 參數(shù)。顧名思義,這是一個(gè)將 keysyncFn 映射起來(lái)的對(duì)象。

const tuaStorage = new TuaStorage({
    // ...
    syncFnMap: {
        "data one": () => axios("data one api"),
        "data two": () => axios("data two api"),
        // ...
    },
})

// 不用手動(dòng)傳 syncFn,默認(rèn)匹配 syncFnMap 中的對(duì)應(yīng)函數(shù)
tuaStorage.load({ key: "data one" })
2.3.自動(dòng)生成配置

其實(shí)手動(dòng)編寫(xiě)每個(gè) api 請(qǐng)求函數(shù)也是很繁瑣的,要是有個(gè)根據(jù)配置自動(dòng)生成請(qǐng)求函數(shù)的庫(kù)就好了~

誒~,巧了么不是~。各位開(kāi)發(fā)者老爺們了解一下同樣跨平臺(tái)的 tua-api ~?

tua-storage 搭配 tua-api 之后會(huì)變成這樣

import TuaStorage from "tua-storage"
import { getSyncFnMapByApis } from "tua-api"

// 本地寫(xiě)好的各種接口配置
import * as apis from "@/apis"

const tuaStorage = new TuaStorage({
    syncFnMap: getSyncFnMapByApis(apis),
})
三、數(shù)據(jù)過(guò)期邏輯

一般各個(gè)平臺(tái)的存儲(chǔ)層都沒(méi)有數(shù)據(jù)過(guò)期這一邏輯。但在使用 tua-storage 時(shí)默認(rèn)每個(gè)數(shù)據(jù)都有過(guò)期時(shí)間這一屬性。

3.1.默認(rèn)過(guò)期時(shí)間

默認(rèn)為 30 秒,可以在初始化時(shí)配置默認(rèn)超時(shí)時(shí)間。

import TuaStorage from "tua-storage"

const tuaStorage = new TuaStorage({
    // 改為 60 秒
    defaultExpires: 60,
})

// 返回一個(gè) Promise
tuaStorage
    .save({
        key: "data key",
        data: { foo: "bar" },

        // 這里傳遞的過(guò)期時(shí)間優(yōu)先級(jí)更高
        expires: 90,
    })
    .then(console.log)
    .catch(console.error)


// 保存到 storage 中的數(shù)據(jù)大概長(zhǎng)這樣
// key 之前會(huì)加上初始化傳入的默認(rèn)前綴
{
    "TUA_STORAGE_PREFIX: data key": {
        expires: 90,
        rawData: { foo: "bar" },
    },
}
3.2.數(shù)據(jù)保存前綴

為了保證存在 storage 中的數(shù)據(jù)名稱不沖突,以及實(shí)現(xiàn)版本控制,tua-storage 默認(rèn)有一個(gè)存儲(chǔ)前綴:storageKeyPrefix。

默認(rèn)值為 TUA_STORAGE_PREFIX: ,所以在上一小節(jié)中保存的數(shù)據(jù)會(huì)有一個(gè)奇怪的前綴。

保證名稱不沖突很好理解,如何實(shí)現(xiàn)版本控制呢?
3.3.白名單機(jī)制

clear 函數(shù)能夠接受一個(gè)白名單數(shù)組(因?yàn)閮?nèi)部是通過(guò) indexOf 來(lái)判斷的,所以不必填寫(xiě)完整的 key 值)。

import TuaStorage from "tua-storage"

const tuaStorage = new TuaStorage({ ... })

tuaStorage.clear(["key"])
    .then(console.log)
    .catch(console.error)

// 假設(shè)現(xiàn)在 storage 中有以下數(shù)據(jù)
{
    "foo": {},
    "bar": {},
    "foo-key": {},
    "bar-key": {},
}

// 清除后剩下的數(shù)據(jù)是
{
    "foo-key": {},
    "bar-key": {},
}

所以在調(diào)用 clear 時(shí),在白名單中傳入新的存儲(chǔ)前綴,即可實(shí)現(xiàn)刪除上一版本數(shù)據(jù)的功能。

import TuaStorage from "tua-storage"

// 上一版本的前綴
const prefix1 = "STORAGE_PREFIX_V1.0: "

// 這一版本的前綴
const prefix2 = "STORAGE_PREFIX_V1.1: "

const tuaStorage = new TuaStorage({
    // 將默認(rèn)前綴切換成新版本的
    storageKeyPrefix: prefix2,
})

// 開(kāi)始清除上個(gè)版本的數(shù)據(jù)
tuaStorage.clear([ prefix2 ])
    .then(console.log)
    .catch(console.error)

更多默認(rèn)配置參閱這里的文檔

四、自動(dòng)清理過(guò)期數(shù)據(jù)

默認(rèn)在啟動(dòng)時(shí)會(huì)進(jìn)行一次過(guò)期數(shù)據(jù)清理(可以關(guān)閉),之后每過(guò)一段時(shí)間會(huì)再次清理。

什么樣的數(shù)據(jù)會(huì)被清理呢?
4.1.清理邏輯

首先當(dāng)然是清理已到過(guò)期時(shí)間的數(shù)據(jù),即有一個(gè)屬性為 expires 的數(shù)據(jù),且當(dāng)前時(shí)間已超過(guò)了該時(shí)間。

一旦遇到不滿足格式的數(shù)據(jù)(非對(duì)象、沒(méi)有 expires 屬性)則跳過(guò),這樣就不會(huì)誤清除其他程序保存的數(shù)據(jù)。

4.2.清理時(shí)間間隔

在初始化時(shí)可傳入 autoClearTime 修改默認(rèn)自動(dòng)清理時(shí)間間隔。

默認(rèn)為一分鐘,注意是以秒為單位。

五、支持永久保存

在某些場(chǎng)景下,可能不方便寫(xiě)過(guò)期時(shí)間,這時(shí)默認(rèn)可以傳遞 expires: null,標(biāo)記該數(shù)據(jù)永不過(guò)期。

不喜歡用 null 標(biāo)記?

大丈夫~,初始化時(shí)傳遞 neverExpireMark 即可修改為你喜歡的別的標(biāo)記。

import TuaStorage from "tua-storage"

const tuaStorage = new TuaStorage({
    neverExpireMark: "never",
})

// 永不過(guò)期
tuaStorage.save({
    key: "some key",
    data: "some data",
    expires: "never",
})
六、支持批量操作

假設(shè)現(xiàn)在有一組數(shù)據(jù)需要保存或讀取,常規(guī)操作就是使用 Promise.all 發(fā)起多個(gè)操作。

import TuaStorage from "tua-storage"

const tuaStorage = new TuaStorage({ ... })

const dataToBeSaved = [
    { key: "key one", data: "some data" },
    { key: "key two", data: "some data" },
]

// 異步
const result = dataToBeSaved
    .map(tuaStorage.save.bind(tuaStorage))
    .then(Promise.all.bind(Promise))

// 同步
const result = dataToBeSaved
    .map(tuaStorage.saveSync.bind(tuaStorage))

講道理這樣寫(xiě)還是挺煩的...所以 tua-storage 的各個(gè) api 還支持直接傳入數(shù)組:

// 異步
tuaStorage.save(dataToBeSaved)
    .then(console.log)
    .catch(console.log)

// 同步
tuaStorage.saveSync(dataToBeSaved)
七、小結(jié)

還在為 web 端、小程序端、React-Native 端、node 端業(yè)務(wù)側(cè)代碼使用不一樣的方式調(diào)用存儲(chǔ)層煩惱么?還在為手動(dòng)數(shù)據(jù)同步,保存數(shù)據(jù),處理過(guò)期邏輯而煩躁么?各位開(kāi)發(fā)者老爺們不妨試一試 tua-storage,(擠需體驗(yàn)三番鐘,里造會(huì)干我一樣,愛(ài)象介款工具)。

靈感來(lái)源

inspired by react-native-storage

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108770.html

相關(guān)文章

  • 將軍令:數(shù)據(jù)安全平臺(tái)建設(shè)實(shí)踐

    摘要:解決方案如圖所示,將軍令分塊,數(shù)據(jù)內(nèi)容權(quán)限平臺(tái)審批流平臺(tái)審計(jì)日志平臺(tái)提供各種靈活可插拔的服務(wù),支持在通用服務(wù)的基礎(chǔ)基礎(chǔ)上進(jìn)行定制開(kāi)發(fā)。 背景 在大數(shù)據(jù)時(shí)代,數(shù)據(jù)已經(jīng)成為公司的核心競(jìng)爭(zhēng)力。此前,我們介紹了美團(tuán)酒旅起源數(shù)據(jù)治理平臺(tái)的建設(shè)與實(shí)踐,主要是通過(guò)各種數(shù)據(jù)分析挖掘手段,為公司發(fā)展決策和業(yè)務(wù)開(kāi)展提供數(shù)據(jù)支持。 近期,業(yè)內(nèi)數(shù)據(jù)安全事件頻發(fā),給相關(guān)企業(yè)造成了無(wú)可挽回的損失,更為數(shù)據(jù)安全防護(hù)...

    vpants 評(píng)論0 收藏0
  • 將軍令:數(shù)據(jù)安全平臺(tái)建設(shè)實(shí)踐

    摘要:解決方案如圖所示,將軍令分塊,數(shù)據(jù)內(nèi)容權(quán)限平臺(tái)審批流平臺(tái)審計(jì)日志平臺(tái)提供各種靈活可插拔的服務(wù),支持在通用服務(wù)的基礎(chǔ)基礎(chǔ)上進(jìn)行定制開(kāi)發(fā)。 背景 在大數(shù)據(jù)時(shí)代,數(shù)據(jù)已經(jīng)成為公司的核心競(jìng)爭(zhēng)力。此前,我們介紹了美團(tuán)酒旅起源數(shù)據(jù)治理平臺(tái)的建設(shè)與實(shí)踐,主要是通過(guò)各種數(shù)據(jù)分析挖掘手段,為公司發(fā)展決策和業(yè)務(wù)開(kāi)展提供數(shù)據(jù)支持。 近期,業(yè)內(nèi)數(shù)據(jù)安全事件頻發(fā),給相關(guān)企業(yè)造成了無(wú)可挽回的損失,更為數(shù)據(jù)安全防護(hù)...

    Binguner 評(píng)論0 收藏0
  • 如何構(gòu)建通用 api 間層

    摘要:是在收到響應(yīng)后執(zhí)行的函數(shù),可以不用返回。一步步介紹了如何構(gòu)建以及使用中間層,來(lái)統(tǒng)一管理接口地址,最后還介紹了下中間件等高級(jí)功能。 零、問(wèn)題的由來(lái) 開(kāi)門見(jiàn)山地說(shuō),這篇文章是一篇安利軟文~,安利的對(duì)象就是最近搞的 tua-api。 顧名思義,這就是一款輔助獲取接口數(shù)據(jù)的工具。 發(fā)請(qǐng)求相關(guān)的工具辣么多,那我為啥要用你呢? 理想狀態(tài)下,項(xiàng)目中應(yīng)該有一個(gè) api 中間層。各種接口在這里定義,業(yè)務(wù)...

    BingqiChen 評(píng)論0 收藏0
  • 進(jìn)階Java架構(gòu)師必看的15本書(shū)

    摘要:阿里巴巴的共享服務(wù)理念以及企業(yè)級(jí)互聯(lián)網(wǎng)架構(gòu)建設(shè)的思路,給這些企業(yè)帶來(lái)了不少新的思路,這也是我最終決定寫(xiě)這本書(shū)的最主要原因。盡在雙阿里巴巴技術(shù)演進(jìn)與超越是迄今唯一由阿里巴巴集團(tuán)官方出品全面闡述雙八年以來(lái)在技術(shù)和商業(yè)上演進(jìn)和創(chuàng)新歷程的書(shū)籍。 showImg(https://segmentfault.com/img/remote/1460000015386860); 1、大型網(wǎng)站技術(shù)架構(gòu):核...

    Julylovin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<