99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

1 用于訪問歷史存儲需求

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

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

每個數(shù)據(jù)id是一個int整數(shù)來表示

每個用戶要保存1萬條id

每次用戶刷新開始的時候需要將這1萬條歷史全部讀取出來過濾一遍

每次用戶刷新結(jié)束的時候需要將新訪問過的10條寫入一遍,如果超過1萬需將最早的記錄擠掉

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

2 Redis方案一:用list存儲

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

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

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

pYYBAGMN08uAUdOAAAAnX5dIbiQ827.png

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

poYBAGMN09uAQwwVAAA8KE_cBD0711.png

3 Redis方案二:用string存儲

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

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

poYBAGMN0_CAWg8LAABH9kH-xPI569.png

耗時測試結(jié)果如下

pYYBAGMN0_aACu3kAAAvCYE15Dw687.png

4 結(jié)論

我們再直觀對比下兩個技術(shù)方案的性能數(shù)據(jù)。

pYYBAGMN1AyAZMp0AAA3xaNNfdE101.png

基于list的方案里,寫入速度非??欤恍枰?.066ms,因?yàn)閮H僅只需要寫入新添加的10條記錄就可以了,再加一次鏈表的截斷操作,但是讀取性能可就要慢很多了,超過了4ms。原因之一是因?yàn)樽x取需要整體遍歷,但其實(shí)還有第二個原因。我們本案例中的數(shù)據(jù)量過大,所以Redis在內(nèi)部實(shí)際上是用雙端鏈表來實(shí)現(xiàn)的。

pYYBAGMN1B-ANd5bAABpFFSQs0I221.png

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

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

poYBAGMN1EGATahpAABZyrvxW70481.png

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

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

2. 對于讀取來說,順序訪問將極大地提升CPU的L1、L2、L3的cache命中率

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



審核編輯:劉清

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

    關(guān)注

    38

    文章

    7653

    瀏覽量

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

    關(guān)注

    1

    文章

    590

    瀏覽量

    22293
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    387

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫,現(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 ?240次閱讀

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

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

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

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

    redis三種集群方案詳解

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

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

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

    DLP4710和DLP4710LC,兩個套件中的DMD是不是一樣的呢?

    ,DLPDLCR4710EVM-G2全高清 DLP4710 芯片組評估模塊,我對比了一兩個套件,發(fā)現(xiàn)它們用的方案基本是一樣的,除了DLP驅(qū)動芯片,一
    發(fā)表于 02-19 07:13

    Redis實(shí)戰(zhàn)筆記

    目前的技術(shù)選型中,Redis 儼然已經(jīng)成為了系統(tǒng)高性能緩存方案的事實(shí)標(biāo)準(zhǔn),因此現(xiàn)在?Redis 也成為了后端開發(fā)的基本技能樹之一。 ? 基
    的頭像 發(fā)表于 02-09 09:12 ?395次閱讀
    <b class='flag-5'>Redis</b>實(shí)戰(zhàn)筆記

    華為云Flexus X實(shí)例,Redis性能加速評測及對比

    加速 Redis 的選項(xiàng)。本文旨在通過實(shí)際測試,展示華為云 Flexus X 實(shí)例加速 Redis 方面的性能優(yōu)勢,并與其他業(yè)界 U1 實(shí)
    的頭像 發(fā)表于 12-29 15:47 ?502次閱讀
    華為云Flexus X實(shí)例,<b class='flag-5'>Redis</b><b class='flag-5'>性能</b>加速評測及<b class='flag-5'>對比</b>

    Redis使用重要的兩個機(jī)制:Reids持久化和主從復(fù)制

    今天這篇文章,我們一起了解 Redis 使用中非常重要的兩個機(jī)制:Reids 持久化和主從復(fù)制。 我們都知道Redis是一內(nèi)存數(shù)據(jù)庫,在學(xué)習(xí)主從同步之前,我們首先要想到
    的頭像 發(fā)表于 12-18 10:33 ?413次閱讀
    <b class='flag-5'>Redis</b>使用重要的<b class='flag-5'>兩個</b>機(jī)制:Reids持久化和主從復(fù)制

    Redis緩存與Memcached的比較

    關(guān)鍵特性和差異: 1. 數(shù)據(jù)存儲 Redis: Redis是一開源的鍵值存儲,支持多種數(shù)據(jù)結(jié)構(gòu),如字符串、列表、集合、有序集合、散列、位圖
    的頭像 發(fā)表于 12-18 09:33 ?597次閱讀

    ad如何設(shè)置兩個元器件的距離

    Altium Designer(簡稱AD)中設(shè)置兩個元器件之間的距離,主要是通過設(shè)置元器件間的安全間距(Clearance)規(guī)則來實(shí)現(xiàn)的。這個規(guī)則定義了元器件之間、元器件與走線之間以及其他設(shè)計元素
    的頭像 發(fā)表于 09-02 15:31 ?1.7w次閱讀

    使用ADS8691有兩個參數(shù)方面的疑問求解

    你好,我現(xiàn)在在使用ADS8691,現(xiàn)在有兩個參數(shù)方面的疑問。 第一是轉(zhuǎn)換時間,如圖所示 CS從拉低開始轉(zhuǎn)換,到RVS跳變?yōu)楦唠娖奖硎巨D(zhuǎn)換完成的時間有1.6us,遠(yuǎn)遠(yuǎn)大于手冊里所說的665ns
    發(fā)表于 08-19 08:27

    雙穩(wěn)態(tài)電路的兩個穩(wěn)定狀態(tài)是什么

    雙穩(wěn)態(tài)電路是一種具有兩個穩(wěn)定狀態(tài)的電子電路,廣泛應(yīng)用于數(shù)字電路、通信系統(tǒng)、存儲器等領(lǐng)域。 雙穩(wěn)態(tài)電路的基本概念 雙穩(wěn)態(tài)電路是一種具有兩個穩(wěn)定狀態(tài)的電路,即在沒有外部輸入信號的情況,電
    的頭像 發(fā)表于 08-11 15:00 ?2651次閱讀

    雙穩(wěn)態(tài)觸發(fā)器的兩個基本性質(zhì)是什么

    的定義 雙穩(wěn)態(tài)觸發(fā)器是一種具有兩個穩(wěn)定狀態(tài)的邏輯電路,通常由兩個交叉耦合的反相器或門電路構(gòu)成。沒有外部輸入信號的情況,雙穩(wěn)態(tài)觸發(fā)器可以保持
    的頭像 發(fā)表于 08-11 10:08 ?1392次閱讀