天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

使用緩存的9大誤區(qū)(下)

  本篇文章在上篇的基礎(chǔ)上繼續(xù)討論了使用緩存的幾個(gè)誤區(qū),包括:緩存大量的數(shù)據(jù)集合,而讀取其中一部分;緩存大量具有圖結(jié)構(gòu)的對(duì)象導(dǎo)致內(nèi)存浪費(fèi);緩存應(yīng)用程序的配置信息;使用很多不同的鍵指向相同的緩存項(xiàng);沒有及時(shí)的更新或者刪除再緩存中已經(jīng)過(guò)期或者失效的數(shù)據(jù)。

  緩存大量的數(shù)據(jù)集合,而讀取其中一部分

  在很多時(shí)候,我們往往會(huì)緩存一個(gè)對(duì)象的集合,但是,我們?cè)谧x取的時(shí)候,只是每次讀取其中一部分。 我們舉個(gè)例子來(lái)說(shuō)明這個(gè)問題(例子可能不是很恰當(dāng),但是足以說(shuō)明問題)。

  在購(gòu)物站點(diǎn)中,常見的操作就是查詢一些產(chǎn)品的信息,這個(gè)時(shí)候,如果用戶輸入了“25寸電視機(jī)”,然后查找相關(guān)的產(chǎn)品。這個(gè)時(shí)候,在后臺(tái),我們可以查詢數(shù)據(jù)庫(kù),找到幾百條這樣的數(shù)據(jù),然后,我們將這幾百條數(shù)據(jù)作為一個(gè)緩存項(xiàng)緩存起來(lái),代碼的代碼如下:

  同時(shí),我們對(duì)找出的產(chǎn)品進(jìn)行分頁(yè)的顯示,每次展示10條。其實(shí)在每次分頁(yè)的時(shí)候,我們都是根據(jù)緩存的鍵去獲取數(shù)據(jù),然后選擇下一個(gè)10條數(shù)據(jù),然后顯示。

  如果是使用本地內(nèi)存緩存,那么這可能不是什么問題,如果是采用分布式緩存,問題就來(lái)了。下圖可以清楚的說(shuō)明這個(gè)過(guò)程,如圖所示:

  相信大家看完這個(gè)圖,然后結(jié)合之前的講述應(yīng)該很清楚了問題所在了:每次都按照緩存鍵獲取全部數(shù)據(jù),然后在應(yīng)用服務(wù)器那里反序列化全部數(shù)據(jù),但是只是取其中10條。

  這里可以將數(shù)據(jù)集合再次拆分,分為例如25-0-10-products,25-11-20-products等的緩存項(xiàng),如下圖所示:

  當(dāng)然,查詢和緩存的方式有很多,拆分的方式也有很多,這里這是給出一些常見的問題!

  緩存大量具有圖結(jié)構(gòu)的對(duì)象導(dǎo)致內(nèi)存浪費(fèi)

  為了更好的說(shuō)明這個(gè)問題,我們首先看到下面的一個(gè)類結(jié)構(gòu)圖,如圖:

  如果我們要把一些Customer數(shù)據(jù)緩存起來(lái),這里就可以可能出現(xiàn)兩個(gè)問題:

  1. 由于使用.NET的默認(rèn)序列化機(jī)制,或者沒有適當(dāng)?shù)募尤胂鄳?yīng)Attribute(屬性),使得緩存了一些原本不需要緩存的數(shù)據(jù)。

  2. 將Customer緩存的時(shí)候,同時(shí),為了更快的獲取Customer的Order信息,將Order信息緩存在了另外一個(gè)緩存項(xiàng)中,導(dǎo)致同一份數(shù)據(jù)被緩存兩次。

  下面,我們就分別來(lái)看看這兩個(gè)問題。

  首先看到第一個(gè)。如果我們使用分布式緩存來(lái)緩存一些Customer的信息的時(shí)候,如果我們沒有自己重新Customer的序列化機(jī)制,而是采用的默認(rèn)的,那么序列化機(jī)制在序列化Customer的時(shí)候,會(huì)將Customer所引用的對(duì)象也序列化,然后在序列化被序列化對(duì)象中的其他引用對(duì)象,最后的結(jié)果就是:Customer被序列化,Customer的Order信息被序列化,Order引用的OrderItem被序列化,最后OrderItem引用的Product也會(huì)序列化。

  整個(gè)對(duì)象圖全部被序列化了,如果這種情況是我們想要的,那么沒有問題;如果不是的,那么,我們就浪費(fèi)了很多的資源了,解決的方法有兩個(gè):第一,自己實(shí)現(xiàn)序列化,自己完全控制哪些對(duì)象需要序列化,我們前面已經(jīng)講過(guò)了;第二,如果使用默認(rèn)的序列化機(jī)制,那么在不要需要序列化的對(duì)象上面加上[NonSerialized]標(biāo)記。

  下面,我們看到第二個(gè)問題。這個(gè)問題主要是由于第一個(gè)問題引起的:原本在緩存Customer的時(shí)候,已經(jīng)將Customer的其他信息,例如Order,Product已經(jīng)緩存了。但是很多的技術(shù)人員不清楚這一點(diǎn),然后又把Customer的Order信息去緩存在其他的緩存項(xiàng),使用的使用就根據(jù)Customer的標(biāo)識(shí),例如ID去緩存中獲取Order信息,如下代碼所示:

  解決這個(gè)問題的方法也比較明顯,參看第一個(gè)問題的解決方案就可以了!

  緩存應(yīng)用程序的配置信息

  因?yàn)榫彺媸怯幸惶讛?shù)據(jù)失效檢測(cè)周期的(之前說(shuō)過(guò),要么是固定時(shí)間失效,要么是相對(duì)時(shí)間失效),所以,很多的技術(shù)人員喜歡把一些動(dòng)態(tài)變化的信息保存在緩存中,以充分利用緩存機(jī)制的這種特性,其中,緩存程序的配置信息就是其中一個(gè)例子。

  因?yàn)樵?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用的中的一些配置,可能會(huì)發(fā)生變化,最簡(jiǎn)單的就是數(shù)據(jù)庫(kù)連接字符串了,如下代碼:

  當(dāng)這樣設(shè)置之后,每隔一段時(shí)間緩存失效之后,就去重新讀取配置文件,這時(shí)候,可能此時(shí)的配置就和之前不一樣了,并且其他的地方都可以讀取緩存從而進(jìn)行更新,特別是在多臺(tái)服務(wù)器上面部署同一個(gè)站點(diǎn)的時(shí)候,有時(shí)候,我們沒有及時(shí)的去修改每個(gè)服務(wù)器上面的站點(diǎn)的配置文件里面的信息,這個(gè)時(shí)候如何使用分布式緩存緩存配置信息,只要更新一個(gè)站點(diǎn)的配置文件,其他站點(diǎn)就全部修改了,技術(shù)人員皆大歡喜。OK,這確實(shí)看起來(lái)是個(gè)不錯(cuò)的方法(在必要的時(shí)候可以采用一下),但是,不是所有的配置信息都要保持一樣的,而且還要考慮怎樣一個(gè)情況:如果緩存服務(wù)器出了問題,宕機(jī)了,那么我們所有使用這個(gè)配置信息的站點(diǎn)可能都會(huì)出問題。

  建議對(duì)于這些配置文件的信息,采用監(jiān)控的機(jī)制,例如文件監(jiān)控,每次文件發(fā)生變化,就重新加載配置信息。

  使用很多不同的鍵指向相同的緩存項(xiàng)

  我們有時(shí)候會(huì)遇到這樣的一個(gè)情況:我們把一個(gè)對(duì)象緩存起來(lái),用一個(gè)鍵作為緩存鍵來(lái)獲取這個(gè)數(shù)據(jù),之后,我們又通過(guò)一個(gè)索引作為緩存鍵來(lái)獲取這個(gè)數(shù)據(jù),如下代碼所示:

  我們之所以這樣寫,主要因?yàn)槲覀儠?huì)以多種方式來(lái)從緩存中讀取數(shù)據(jù),例如在進(jìn)行循環(huán)遍歷的時(shí)候,需要通過(guò)索引來(lái)獲取數(shù)據(jù),例如index++等,而有些情況,我們可能需要通過(guò)其他的方式,例如,產(chǎn)品名來(lái)獲取產(chǎn)品的信息。

  如果遇到這樣的情況,那么就建議將這些多個(gè)鍵組合起來(lái),形成如下的形式:

  另外一個(gè)常見的問題就是:相同的數(shù)據(jù)被緩存在不同的緩存項(xiàng)中,例如,如果用戶查詢尺寸為36寸的彩電,那么可能有可能一個(gè)編號(hào)為100的電視產(chǎn)品就在結(jié)果中,此時(shí),我們將結(jié)果緩存。另外,用戶在查找一個(gè)生產(chǎn)廠家為TCL的電視,如果編號(hào)為100的電視產(chǎn)品又出現(xiàn)在結(jié)果中,我們把結(jié)果又緩存在另外一個(gè)緩存項(xiàng)中。這個(gè)時(shí)候,很顯然,出現(xiàn)了內(nèi)存的浪費(fèi)。

  對(duì)于這樣的情況,之前筆者采用的方法就是,在緩存中創(chuàng)建了一個(gè)索引列表,如圖所示:

  當(dāng)然,這其中有很多的細(xì)節(jié)和問題需要解決,這里就不一一述說(shuō),要看各自的應(yīng)用和情況而定! 也非常歡迎大家提供更好的方法。

  沒有及時(shí)的更新或者刪除再緩存中已經(jīng)過(guò)期或者失效的數(shù)據(jù)

  這種情況應(yīng)該是使用緩存最常見的問題,例如,如果我們現(xiàn)在獲取了一個(gè)Customer的所有沒有處理的訂單的信息,然后緩存起來(lái),類似的代碼如下:

  之后,用戶的一個(gè)訂單被處理了,但是緩存還沒有更新,那么這個(gè)時(shí)候,緩存中的數(shù)據(jù)就已經(jīng)有問題!當(dāng)然,我這里只是列舉的最簡(jiǎn)單的場(chǎng)景,大家可以聯(lián)想自己應(yīng)用中的其他產(chǎn)品,很有可能會(huì)出現(xiàn)緩存中的數(shù)據(jù)和實(shí)際數(shù)據(jù)庫(kù)中的不一樣。

  現(xiàn)在很多的時(shí)候,我們已經(jīng)容忍了這種短時(shí)間的不一致的情況。其實(shí)對(duì)于這種情況,沒有非常完美的解決方案,如果要做,倒是可以實(shí)現(xiàn),例如每次修改或者刪除一個(gè)數(shù)據(jù),就去遍歷緩存中的所有數(shù)據(jù),然后進(jìn)行操作,但是這樣往往得不償失。另外一個(gè)折中的方法就是,判斷數(shù)據(jù)的變化周期,然后盡可能的將緩存的時(shí)間變短一點(diǎn)。

NET技術(shù)使用緩存的9大誤區(qū)(下),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 阿v天堂2017在无码 | 又爽又黄又粗又大免费视频 | 日韩AV爽爽爽久久久久久 | 叮当成人社区 | 少妇无码吹潮久久精品AV网站 | 欧洲最大无人区免费高清完整版 | 丰满艳妇亲伦 | 一边啪啪的一边呻吟声口述 | 大地影院日本韩国电影免费观看 | 广西美女色炮150p图 | 国产成人99久久亚洲综合精品 | 国产精品一区二区20P | 麻豆国产人妻精品无码AV | 欧美视频毛片在线播放 | 高h肉肉乳共妻 | 性奴公司 警花 | 99视频导航 | 特级做A爰片毛片免费看108 | 午夜A级理论片左线播放 | 亚洲视频欧美视频 | 亚洲国产欧美日本大妈 | 国产亚洲美女在线视频视频 | 人人看人人看 | 中文字幕福利视频在线一区 | 国产精品夜夜春夜夜爽久久小 | 影视先锋男人无码在线 | 久青草国产在线视频亚瑟影视 | 性直播免费| wwwwxxxxx中国| 久久毛片免费看一区二区三区 | 视频在线观看高清免费看 | 免费看大黄高清网站视频在线 | 亚洲国产精品第一影院在线观看 | 色狠狠AV老熟女 | 国自产精品手机在线视频 | 午夜阳光影院在线观看视频 | 色网址在线观看 | 成人天堂婷婷青青视频在线观看 | 午夜免费福利片 | 全文都是肉高h文 | 99久久国语露脸精品国产 |