国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對(duì)比兩個(gè)基于Redis下的存儲(chǔ)方案在性能方面的優(yōu)劣

冬至配餃子 ? 來(lái)源:開(kāi)發(fā)內(nèi)功修煉 ? 作者:張彥飛allen ? 2022-08-30 17:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

現(xiàn)代的開(kāi)發(fā)語(yǔ)言除了C++以外,大部分都對(duì)內(nèi)存管理做好了封裝,一般的開(kāi)發(fā)者根本都接觸不到內(nèi)存的底層操作。更何況現(xiàn)在各種優(yōu)秀的開(kāi)源組件應(yīng)用越來(lái)越多,例如mysql、redis等,這些甚至都不需要大家動(dòng)手開(kāi)發(fā),直接拿來(lái)用就好了。所以有些同學(xué)也會(huì)覺(jué)得作為應(yīng)用層開(kāi)發(fā)的同學(xué)沒(méi)有學(xué)習(xí)的必要去學(xué)習(xí)底層。

但我想通過(guò)本文的實(shí)際案例告訴大家,哪怕不直接接觸內(nèi)存底層操作,就只是用一些開(kāi)源的工具,如果你能理解底層的工作原理,你也能夠用到極致。

1 用于訪問(wèn)歷史存儲(chǔ)需求

假如現(xiàn)在有這樣一個(gè)業(yè)務(wù)需求,用戶每次刷新都需要獲得要消費(fèi)的新數(shù)據(jù),但是不能和之前訪問(wèn)過(guò)的歷史重復(fù)。你可以把它和你經(jīng)常在用的今日頭條之類的信息流app聯(lián)系起來(lái)。每次都要看到新的新聞,但是你肯定不想看到過(guò)去已經(jīng)看過(guò)的文章。這樣在功能實(shí)現(xiàn)的時(shí)候,就必要保存用戶的訪問(wèn)歷史。當(dāng)用戶再來(lái)刷新的時(shí)候,首先得獲取用戶的歷史記錄,要保證推給用戶的數(shù)據(jù)和之前的不重復(fù)。當(dāng)推薦完成的時(shí)候,也需要把這次新推薦過(guò)的數(shù)據(jù)id記錄到歷史里。

為了適當(dāng)降低實(shí)現(xiàn)復(fù)雜度,我們可以規(guī)定每個(gè)用戶只要不和過(guò)去的一萬(wàn)條記錄重復(fù)就可以了。這樣每個(gè)用戶最多只需要保存一萬(wàn)條歷史id,如果存滿了就把最早的歷史記錄擠掉。我們進(jìn)一步具體化一下這個(gè)需求的幾個(gè)關(guān)鍵點(diǎn):

每個(gè)數(shù)據(jù)id是一個(gè)int整數(shù)來(lái)表示

每個(gè)用戶要保存1萬(wàn)條id

每次用戶刷新開(kāi)始的時(shí)候需要將這1萬(wàn)條歷史全部讀取出來(lái)過(guò)濾一遍

每次用戶刷新結(jié)束的時(shí)候需要將新訪問(wèn)過(guò)的10條寫(xiě)入一遍,如果超過(guò)1萬(wàn)需將最早的記錄擠掉

可見(jiàn),每次用戶訪問(wèn)的時(shí)候,會(huì)涉及到一個(gè)1萬(wàn)規(guī)模的數(shù)據(jù)集上的一次讀取和一次寫(xiě)入操作。好了,需求描述完了,我們?cè)趺礃舆M(jìn)行我們的技術(shù)方案的設(shè)計(jì)呢?相信你也能想到很多實(shí)現(xiàn)方案,我們今天來(lái)對(duì)比兩個(gè)基于Redis下的存儲(chǔ)方案在性能方面的優(yōu)劣。

2 Redis方案一:用list存儲(chǔ)

首先能想到的第一個(gè)辦法就是用Redis的List來(lái)保存。因?yàn)檫@個(gè)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的太適合上面的場(chǎng)景了。List下的lrange命令可以實(shí)現(xiàn)一次性讀取用戶的所有數(shù)據(jù)id的需求。

$redis->lrange('TEST_KEY', 0,9999);

lpush命令可以實(shí)現(xiàn)新的數(shù)據(jù)id的寫(xiě)入,ltrim可以保證將用戶的記錄數(shù)量不超過(guò)1萬(wàn)條。

pYYBAGMN08uAUdOAAAAnX5dIbiQ827.png

我們準(zhǔn)備一個(gè)用戶,提前存好一萬(wàn)條id。寫(xiě)入的時(shí)候每次只寫(xiě)入10條新的id,讀取的時(shí)候通過(guò)lrange一次全部讀取出來(lái)。進(jìn)行一下性能耗時(shí)測(cè)試,結(jié)果如下。

poYBAGMN09uAQwwVAAA8KE_cBD0711.png

3 Redis方案二:用string存儲(chǔ)

我能想到的另外一個(gè)技術(shù)方案就是直接用String來(lái)存。我們可以把1萬(wàn)個(gè)int表示的數(shù)據(jù)id拼接成一個(gè)字符串,用一個(gè)特殊的字符把他們分割開(kāi)。例如:"100000_100001_10002"這種。存儲(chǔ)的時(shí)候,拼接一下,然后把這個(gè)大字符串寫(xiě)到Redis里。讀取的時(shí)候,把大字符串整體讀取出來(lái),然后再用字符切割成數(shù)組來(lái)使用。

由于用string存儲(chǔ)的時(shí)候,保存前多了一個(gè)拼接字符串的操作,讀取后多了一步將字符串分割成數(shù)組的操作。在測(cè)試string方案的時(shí)候,為了公平起見(jiàn),我們把需要把這兩步的開(kāi)銷(xiāo)也考慮進(jìn)來(lái)。核心代碼如下:

poYBAGMN0_CAWg8LAABH9kH-xPI569.png

耗時(shí)測(cè)試結(jié)果如下

pYYBAGMN0_aACu3kAAAvCYE15Dw687.png

4 結(jié)論

我們?cè)僦庇^對(duì)比下兩個(gè)技術(shù)方案的性能數(shù)據(jù)。

pYYBAGMN1AyAZMp0AAA3xaNNfdE101.png

基于list的方案里,寫(xiě)入速度非常快,只需要0.066ms,因?yàn)閮H僅只需要寫(xiě)入新添加的10條記錄就可以了,再加一次鏈表的截?cái)嗖僮鳎亲x取性能可就要慢很多了,超過(guò)了4ms。原因之一是因?yàn)樽x取需要整體遍歷,但其實(shí)還有第二個(gè)原因。我們本案例中的數(shù)據(jù)量過(guò)大,所以Redis在內(nèi)部實(shí)際上是用雙端鏈表來(lái)實(shí)現(xiàn)的。

pYYBAGMN1B-ANd5bAABpFFSQs0I221.png

通過(guò)上圖你可能看出來(lái),鏈表是通過(guò)指針串起來(lái)的。大量的node之間極大可能是隨機(jī)地分布在內(nèi)存的各個(gè)位置上,這樣你遍歷整個(gè)鏈表的時(shí)候,實(shí)際上大概率會(huì)導(dǎo)致內(nèi)存的隨機(jī)模式下工作。

基于string方案在寫(xiě)入的時(shí)候耗時(shí)比list要高,因?yàn)槊看味嫉眯枰獙?萬(wàn)條全部寫(xiě)入一遍。但是讀取性能卻比list高了10倍,總體上耗時(shí)加起來(lái)大約只有方案一的1/4左右。為什么?我們?cè)賮?lái)看下redis string數(shù)據(jù)結(jié)構(gòu)的內(nèi)存布局

poYBAGMN1EGATahpAABZyrvxW70481.png

可見(jiàn),如果用string來(lái)存儲(chǔ)的話,不管用戶的數(shù)據(jù)id有多少,訪問(wèn)將全部都是順序IO。順序IO的好處有兩點(diǎn):

1. 一內(nèi)存的順序IO的耗時(shí)大約只是隨機(jī)IO的1/3-1/4左右,

2. 對(duì)于讀取來(lái)說(shuō),順序訪問(wèn)將極大地提升CPU的L1、L2、L3的cache命中率

所以如果你深入了內(nèi)存的工作原理,哪怕你不能直接去操作內(nèi)存,即使只是用一些開(kāi)源的軟件,你也能夠?qū)⑺男阅馨l(fā)揮到極致~



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    39

    文章

    7739

    瀏覽量

    171675
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23165
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    392

    瀏覽量

    12186
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    降壓轉(zhuǎn)換器與LDO的優(yōu)劣對(duì)比

    本文將繼續(xù)介紹降壓轉(zhuǎn)換器的自發(fā)熱效應(yīng)考量、降壓轉(zhuǎn)換器與LDO的優(yōu)劣對(duì)比等。
    的頭像 發(fā)表于 02-25 15:37 ?319次閱讀
    降壓轉(zhuǎn)換器與LDO的<b class='flag-5'>優(yōu)劣</b><b class='flag-5'>對(duì)比</b>

    MCU方面,能不能給出芯源的MCU與主流的MCU之前的對(duì)比,包括優(yōu)劣勢(shì)、替換狀態(tài)等?

    MCU方面,能不能給出芯源的MCU與主流的MCU之前的對(duì)比,包括優(yōu)劣勢(shì)、替換狀態(tài)等?
    發(fā)表于 01-30 06:13

    曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)

    近期,曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng),自研技術(shù)產(chǎn)品國(guó)產(chǎn)突破、AI行業(yè)應(yīng)用等方面的成果獲得廣泛關(guān)注。
    的頭像 發(fā)表于 01-15 16:28 ?2496次閱讀

    【產(chǎn)品應(yīng)用】?jī)?chǔ)能網(wǎng)關(guān)EM-1000與EM-1000G的Redis性能對(duì)比

    視頻推薦隨著儲(chǔ)能控制系統(tǒng)智能化發(fā)展,對(duì)實(shí)時(shí)處理和高速緩存需求提升。本測(cè)試對(duì)EM-1000與EM-1000G的Redis性能進(jìn)行對(duì)比,評(píng)估其吞吐、響應(yīng)與穩(wěn)定性上的差異,為客戶提供精準(zhǔn)硬
    的頭像 發(fā)表于 12-02 11:39 ?331次閱讀
    【產(chǎn)品應(yīng)用】?jī)?chǔ)能網(wǎng)關(guān)EM-1000與EM-1000G的<b class='flag-5'>Redis</b><b class='flag-5'>性能對(duì)比</b>

    FreeRtos 能否同時(shí)使用兩個(gè) CPU?

    的情況,CM0 更愿意專門(mén)用于管理外設(shè)。 - 是否有 CM0 和 CM4 中同時(shí)運(yùn)行代碼的簡(jiǎn)單示例或教程? - FreeRtos 能否同時(shí)使用兩個(gè) CPU?
    發(fā)表于 11-11 08:28

    對(duì)比銅纜和光纖電纜的具體優(yōu)劣

    光纖電纜傳輸速度、帶寬、抗干擾性、安全性和耐久性方面具有顯著優(yōu)勢(shì),而銅纜成本、安裝便利性和供電能力上更勝一籌。具體優(yōu)劣對(duì)比如下: 光纖電
    的頭像 發(fā)表于 09-30 10:01 ?1443次閱讀

    個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash?

    個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash,有一個(gè)norflash被模擬成U盤(pán),會(huì)在中斷中操作spi。
    發(fā)表于 09-26 06:18

    基本半導(dǎo)體連獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)

    近日,基本半導(dǎo)體憑借碳化硅模塊領(lǐng)域的突出表現(xiàn),連獲“國(guó)產(chǎn)SiC模塊TOP企業(yè)獎(jiǎng)”和“年度優(yōu)秀功率器件產(chǎn)品獎(jiǎng)”兩個(gè)行業(yè)獎(jiǎng)項(xiàng)。
    的頭像 發(fā)表于 09-05 16:31 ?1095次閱讀

    如何使用 SPI 全雙工兩個(gè) 5LP MPU 之間連接 RAM?

    并將其存儲(chǔ)相同的內(nèi)存位置中,從而將數(shù)據(jù)位置與數(shù)據(jù)進(jìn)行鏡像。 我想我 I2C 部分讀過(guò)一個(gè)允許這種類型傳輸?shù)?API,但我不確定在哪里找到它。 我
    發(fā)表于 07-15 06:20

    Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹
    的頭像 發(fā)表于 07-08 17:56 ?856次閱讀

    【經(jīng)驗(yàn)分享】Omni3576上編譯Redis-8.0.2源碼,并安裝及性能測(cè)試

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis
    的頭像 發(fā)表于 06-05 08:05 ?980次閱讀
    【經(jīng)驗(yàn)分享】<b class='flag-5'>在</b>Omni3576上編譯<b class='flag-5'>Redis</b>-8.0.2源碼,并安裝及<b class='flag-5'>性能</b>測(cè)試

    隔離變壓器繞組用銅線和鋁線的優(yōu)劣對(duì)比

    電氣工程的廣闊天地中,隔離變壓器雖不起眼,卻扮演著舉足輕重的角色,其性能和穩(wěn)定性直接影響到整個(gè)系統(tǒng)的運(yùn)行效果,因此,隔離變壓器線圈材質(zhì)的挑選顯得尤為關(guān)鍵,目前,主要有種材質(zhì):銅線和鋁線,那么面對(duì)這
    的頭像 發(fā)表于 06-04 15:07 ?1733次閱讀
    隔離變壓器繞組用銅線和鋁線的<b class='flag-5'>優(yōu)劣</b><b class='flag-5'>對(duì)比</b>

    【幸狐Omni3576邊緣計(jì)算套件試用體驗(yàn)】Redis最新8.0.2版本源碼安裝及性能測(cè)試

    的結(jié)果進(jìn)行對(duì)比。 一、Redis是什么 維基百科的介紹是: Redis是一個(gè)使用ANSI C編寫(xiě)的開(kāi)源、支持網(wǎng)絡(luò)、基于內(nèi)存、分布式、可選持久性的鍵值對(duì)
    發(fā)表于 06-03 01:28

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過(guò)10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?1534次閱讀
    <b class='flag-5'>redis</b>三種集群<b class='flag-5'>方案</b>詳解

    石墨膜和銅VC散熱性能和應(yīng)用方面的區(qū)別

    石墨散熱膜與銅VC(均熱板)散熱性能和應(yīng)用方面的區(qū)別如下:一、散熱性能對(duì)比1.導(dǎo)熱機(jī)制◎石墨散熱膜:依賴石墨材料平面方向的高導(dǎo)熱性(15
    的頭像 發(fā)表于 03-13 17:13 ?3129次閱讀
    石墨膜和銅VC散熱<b class='flag-5'>性能</b>和應(yīng)用<b class='flag-5'>方面的</b>區(qū)別