1霍衫、背景介紹
all we know,所有的網(wǎng)站都有這種分頁(yè)列表们童,他們展示一些簡(jiǎn)單的數(shù)據(jù)畔况,用來(lái)讓用戶初步的篩選出他想要的東西,然后再點(diǎn)擊查看詳細(xì)信息慧库。
可能有人會(huì)想跷跪,為什么基礎(chǔ)信息和詳細(xì)信息需要分開呢??jī)蓚€(gè)原因
- 列表頁(yè)只展示簡(jiǎn)單的信息齐板,一次性可以查看更多的條數(shù)
- 只展示簡(jiǎn)單的信息吵瞻,前后端交互時(shí)響應(yīng)時(shí)間可以大大縮短
2、來(lái)自產(chǎn)品經(jīng)理的需求
??需求來(lái)了甘磨,隨之的問(wèn)題就來(lái)了橡羞,產(chǎn)品經(jīng)理總會(huì)為了用戶的體驗(yàn)而要求在列表頁(yè)加一些醒目的信息突出,而往往有些東西是需要計(jì)算得出的(如商品的折扣信息)济舆。
解決方法如下:
列表頁(yè)迭代進(jìn)行計(jì)算
按每頁(yè)10行數(shù)據(jù)來(lái)說(shuō)卿泽,一次計(jì)算按20ms來(lái)算,一頁(yè)需要多花費(fèi)200ms的時(shí)間來(lái)計(jì)算滋觉,加上rpc調(diào)用的話签夭,一個(gè)頁(yè)面上需要多花費(fèi)500ms左右的時(shí)間∽迪溃可見這個(gè)方法不可取第租。數(shù)據(jù)庫(kù)加上表或字段用于讀取
現(xiàn)在的列表頁(yè)一般都是用搜索引擎來(lái)優(yōu)化搜索和加快響應(yīng)時(shí)間,數(shù)據(jù)庫(kù)層面的改動(dòng)牽一發(fā)而動(dòng)全身我纪,這是一個(gè)浩大的工程煌妈。這是一個(gè)最終需要使用的方案,但很難一下子完成宣羊。列表頁(yè)使用緩存
在從搜索引擎獲取到數(shù)據(jù)后璧诵,再迭代從緩存中獲取。這是簡(jiǎn)單且能夠快速實(shí)現(xiàn)的方案了仇冯,但是又要考慮緩存失效時(shí)候的效率之宿,畢竟計(jì)算出來(lái)的東西需要更新。
3苛坚、不能接受緩存失效時(shí)的效率比被,考慮異步更新緩存
異步緩存是什么色难,即緩存的更新另開線程去做,在緩存更新之前等缀,還是返回舊的緩存數(shù)據(jù)枷莉。
緩存格式
緩存應(yīng)該是一個(gè)永久的帶有過(guò)期時(shí)間的類創(chuàng)建緩存更新線程池
根據(jù)服務(wù)器的性能創(chuàng)建一定大小的線程池,用于更新緩存什么時(shí)候更新緩存
當(dāng)獲取到的緩存尺迂,轉(zhuǎn)換為類后笤妙,得到過(guò)期時(shí)間在當(dāng)前時(shí)間之前,則進(jìn)行緩存更新(過(guò)期時(shí)間也相應(yīng)更新)噪裕。如何更新緩存
單機(jī)時(shí)蹲盘,通過(guò)線程池執(zhí)行更新緩存操作。
分布式時(shí)膳音,使用mq進(jìn)行更新緩存操作的推送召衔,消費(fèi)者通過(guò)線程池執(zhí)行緩存更新操作(當(dāng)然,也可以專門有個(gè)服務(wù)用來(lái)更新緩存)祭陷。
不管是單機(jī)還是分布式都應(yīng)該考慮緩存更新操作時(shí)候的冪等性苍凛。
4、緩存預(yù)熱數(shù)據(jù)量太大兵志,考慮異步更新緩存
以之前說(shuō)到的計(jì)算數(shù)據(jù)為例醇蝴,因?yàn)閯偵暇€,緩存中肯定沒(méi)有相應(yīng)的數(shù)據(jù)毒姨,這時(shí)候如果大量請(qǐng)求過(guò)來(lái),服務(wù)器宕機(jī)的可能性很大(沒(méi)有做限流的前提下)钉寝。
- 緩存預(yù)熱
能想一下弧呐,大量的數(shù)據(jù)去進(jìn)行預(yù)熱是多么麻煩的一件事,尤其是程序員還是如此懶惰的生物嵌纲,這種耗時(shí)耗力的事情反正我是不愿意去做的emmm - 異步更新緩存
結(jié)合上一點(diǎn)說(shuō)到的俘枫,不僅當(dāng)緩存類里面的過(guò)期時(shí)間到了返回舊值并異步更新緩存,我們也可以當(dāng)緩存中未取到值時(shí)逮走,返回空值并異步更新緩存鸠蚪。