一個(gè)別出心裁耳胎,但毫無(wú)卵用的緩存框架

JsonCache.png

簡(jiǎn)介

目前大多數(shù)緩存框架都是用Java序列化的方式實(shí)現(xiàn)的持久化存儲(chǔ)羹蚣,我們自己公司的項(xiàng)目也是這么做的摄职,功能全面而且效率也高几颜, 使用起來(lái)得心應(yīng)手脸候,但是有一個(gè)小問(wèn)題穷娱,如果數(shù)據(jù)結(jié)構(gòu)發(fā)生變化,尤其是原字段的數(shù)據(jù)類(lèi)型發(fā)生變化纪他,在加載緩存時(shí)會(huì)出現(xiàn)異常鄙煤,即便寫(xiě)了序列號(hào)也沒(méi)有用。還有一個(gè)小問(wèn)題就是存儲(chǔ)文件稍微有一點(diǎn)大茶袒,于是在和同事交流過(guò)程中我有了一個(gè)新想法梯刚,能不能用json實(shí)現(xiàn)緩存? 我當(dāng)時(shí)大致的思路是這樣的:

  • 對(duì)象bean -> Json -> String -> 壓縮String -> 存儲(chǔ)
  • 讀取 -> 壓縮String -> String -> Json -> 對(duì)象bean

經(jīng)過(guò)一番嘗試薪寓,發(fā)現(xiàn)是可行的亡资,于是就誕生了這個(gè)JsonCache澜共。

比較

這種方式和序列化方式相比,主要是解決了上面提到的兩個(gè)問(wèn)題锥腻,但是它也有缺點(diǎn)嗦董。

  • 它的緩存文件要小,尤其是數(shù)據(jù)較大并且重復(fù)度高的時(shí)候瘦黑,它的緩存文件要比序列化文件小幾十倍京革,當(dāng)然這種情況比較極端,通常文件小兩倍左右幸斥,這要?dú)w功于強(qiáng)大的字符串壓縮算法匹摇。
  • 數(shù)據(jù)結(jié)構(gòu)發(fā)生變化也不會(huì)出現(xiàn)異常,包括新增字段甲葬,修改字段廊勃,修改字段類(lèi)型都沒(méi)有問(wèn)題。
  • 為什么上圖說(shuō)它“毫無(wú)卵用”呢经窖,是因?yàn)樾室刃蛄谢绞降秃脦妆镀碌妫跀?shù)據(jù)量較大時(shí),字符串的壓縮和解壓縮需要消耗一定的時(shí)間画侣。

架構(gòu)

架構(gòu)圖.png

整個(gè)工程比較簡(jiǎn)單冰悠,大體上分三層,第一是api層棉钧,對(duì)外提供的接口屿脐,第二是action層,分為MemoryCache和DiskCache宪卿,第三是io層,負(fù)責(zé)數(shù)據(jù)的讀寫(xiě)万栅。Json和對(duì)象bean的轉(zhuǎn)換用的是fastJson佑钾,alibaba既然取名叫fastJson,是不是真的很快呢烦粒?有人做過(guò)實(shí)驗(yàn)休溶,當(dāng)數(shù)據(jù)比較大、比較多時(shí)扰她,fastJson的效率確實(shí)要?jiǎng)龠^(guò)其它json框架兽掰。最后當(dāng)然還有一個(gè)字符串壓縮算法。

代碼實(shí)現(xiàn)

這部分就不詳細(xì)說(shuō)了徒役,大家直接去頂部Github下載源碼即可孽尽,這里貼一堆代碼也沒(méi)什么意義。簡(jiǎn)單講一下流程:

  • 支持存儲(chǔ)List忧勿、對(duì)象bean杉女、String瞻讽、int、float熏挎、double
  • 所有存取操作都支持同步和異步兩種模式
  • 緩存分為內(nèi)存和磁盤(pán)兩級(jí)速勇,先取內(nèi)存,內(nèi)存有值就直接返回坎拐,沒(méi)有再取磁盤(pán)
  • 緩存配置目前支持內(nèi)存緩存?zhèn)€數(shù)烦磁、緩存時(shí)間,磁盤(pán)緩存?zhèn)€數(shù)哼勇、緩存時(shí)間都伪,磁盤(pán)緩存路徑
  • 初始化可以使用默認(rèn)配置,也可以自定義配置

使用

1猴蹂、編譯

// 添加倉(cāng)庫(kù)
allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}
// 添加編譯
compile 'com.github.rjlatgithub:JsonCache:v1.2.0'

2院溺、配置

// 默認(rèn)配置
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        JsonCache.getInstance().init(getApplicationContext());
    }
}
// 自定義配置
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Configuration configuration = new Configuration();
        configuration.setCacheDir("http://sdcard/cache/");
        configuration.setMemoryCacheCount(20);
        configuration.setMemoryCacheTime(Configuration.DAY);
        configuration.setDiskCacheCount(100);
        configuration.setDiskCacheTime(Configuration.MONTH + Configuration.DAY * 5);
        JsonCache.getInstance().init(getApplicationContext(), configuration);
    }
}

3、使用

// 同步存取
User user = new User("張三", 12);
JsonCache.getInstance().saveObject("user", user);

User user = JsonCache.getInstance().loadObject("user", User.class);
// 異步存取
User user = new User("張三", 12);
JsonCache.getInstance().saveObjectAsync("user", user);

JsonCache.getInstance().loadObjectAsync("user", User.class, new ICallback<User>() {
    @Override
    public void onResult(User user) {
        Toast.makeText(MainActivity.this, user.toString(), Toast.LENGTH_LONG).show();
    }
});

優(yōu)化

  • 未來(lái)優(yōu)化重點(diǎn)是效率磅轻,目前的測(cè)試結(jié)果珍逸,存、取相同對(duì)象數(shù)據(jù)聋溜,JsonCache的時(shí)間比序列化方式多兩三倍左右谆膳。
  • 未來(lái)還可以增加一些實(shí)用的配置項(xiàng),目前支持的配置還比較簡(jiǎn)單撮躁。
  • 數(shù)據(jù)安全性也是一個(gè)未來(lái)優(yōu)化點(diǎn)漱病,項(xiàng)目是開(kāi)源的,所以如果別人拿到了你的緩存文件把曼,就可以很輕松地獲取原始數(shù)據(jù)杨帽。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗤军,隨后出現(xiàn)的幾起案子注盈,更是在濱河造成了極大的恐慌,老刑警劉巖叙赚,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件老客,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡震叮,警方通過(guò)查閱死者的電腦和手機(jī)胧砰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苇瓣,“玉大人尉间,你說(shuō)我怎么就攤上這事。” “怎么了乌妒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汹想,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撤蚊,道長(zhǎng)古掏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任侦啸,我火速辦了婚禮槽唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘光涂。我一直安慰自己庞萍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布忘闻。 她就那樣靜靜地躺著钝计,像睡著了一般。 火紅的嫁衣襯著肌膚如雪齐佳。 梳的紋絲不亂的頭發(fā)上私恬,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音炼吴,去河邊找鬼本鸣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硅蹦,可吹牛的內(nèi)容都是我干的荣德。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼童芹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涮瞻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起假褪,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饲宛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嗜价,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幕庐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年久锥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片异剥。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瑟由,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冤寿,到底是詐尸還是另有隱情歹苦,我是刑警寧澤青伤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站殴瘦,受9級(jí)特大地震影響狠角,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚪腋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一丰歌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屉凯,春花似錦立帖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至灌旧,卻和暖如春绑咱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背节榜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工羡玛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宗苍。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓稼稿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親讳窟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子让歼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)丽啡,斷路器谋右,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評(píng)論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法补箍,內(nèi)部類(lèi)的語(yǔ)法改执,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法坑雅,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,622評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,810評(píng)論 0 11
  • 為何要這樣 拿整個(gè)夜晚 去換一夜無(wú)眠 窗外的燈紅柳綠 與你無(wú)關(guān) 悲傷的人哪 總要回家 你卻說(shuō)家太遠(yuǎn) 怕半途死掉 可...
    燦7閱讀 119評(píng)論 4 5