在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

對比兩個基于Redis下的存儲方案在性能方面的優劣

冬至配餃子 ? 來源:開發內功修煉 ? 作者:張彥飛allen ? 2022-08-30 17:13 ? 次閱讀

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

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

1 用于訪問歷史存儲需求

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

為了適當降低實現復雜度,我們可以規定每個用戶只要不和過去的一萬條記錄重復就可以了。這樣每個用戶最多只需要保存一萬條歷史id,如果存滿了就把最早的歷史記錄擠掉。我們進一步具體化一下這個需求的幾個關鍵點:

每個數據id是一個int整數來表示

每個用戶要保存1萬條id

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

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

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

2 Redis方案一:用list存儲

首先能想到的第一個辦法就是用Redis的List來保存。因為這個數據結構設計的太適合上面的場景了。List下的lrange命令可以實現一次性讀取用戶的所有數據id的需求。

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

lpush命令可以實現新的數據id的寫入,ltrim可以保證將用戶的記錄數量不超過1萬條。

pYYBAGMN08uAUdOAAAAnX5dIbiQ827.png

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

poYBAGMN09uAQwwVAAA8KE_cBD0711.png

3 Redis方案二:用string存儲

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

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

poYBAGMN0_CAWg8LAABH9kH-xPI569.png

耗時測試結果如下

pYYBAGMN0_aACu3kAAAvCYE15Dw687.png

4 結論

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

pYYBAGMN1AyAZMp0AAA3xaNNfdE101.png

基于list的方案里,寫入速度非???,只需要0.066ms,因為僅僅只需要寫入新添加的10條記錄就可以了,再加一次鏈表的截斷操作,但是讀取性能可就要慢很多了,超過了4ms。原因之一是因為讀取需要整體遍歷,但其實還有第二個原因。我們本案例中的數據量過大,所以Redis在內部實際上是用雙端鏈表來實現的。

pYYBAGMN1B-ANd5bAABpFFSQs0I221.png

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

基于string方案在寫入的時候耗時比list要高,因為每次都得需要將1萬條全部寫入一遍。但是讀取性能卻比list高了10倍,總體上耗時加起來大約只有方案一的1/4左右。為什么?我們再來看下redis string數據結構的內存布局

poYBAGMN1EGATahpAABZyrvxW70481.png

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

1. 一內存的順序IO的耗時大約只是隨機IO的1/3-1/4左右,

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

所以如果你深入了內存的工作原理,哪怕你不能直接去操作內存,即使只是用一些開源的軟件,你也能夠將它的性能發揮到極致~



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7514

    瀏覽量

    164001
  • 字符串
    +關注

    關注

    1

    文章

    584

    瀏覽量

    20553
  • Redis
    +關注

    關注

    0

    文章

    376

    瀏覽量

    10888
收藏 人收藏

    評論

    相關推薦

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

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

    Redis使用重要的兩個機制:Reids持久化和主從復制

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

    Redis緩存與Memcached的比較

    關鍵特性和差異: 1. 數據存儲 Redis: Redis是一開源的鍵值存儲,支持多種數據結構,如字符串、列表、集合、有序集合、散列、位圖
    的頭像 發表于 12-18 09:33 ?169次閱讀

    ad如何設置兩個元器件的距離

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

    使用ADS8691有兩個參數方面的疑問求解

    你好,我現在在使用ADS8691,現在有兩個參數方面的疑問。 第一是轉換時間,如圖所示 CS從拉低開始轉換,到RVS跳變為高電平表示轉換完成的時間有1.6us,遠遠大于手冊里所說的665ns
    發表于 08-19 08:27

    雙穩態電路的兩個穩定狀態是什么

    雙穩態電路是一種具有兩個穩定狀態的電子電路,廣泛應用于數字電路、通信系統、存儲器等領域。 雙穩態電路的基本概念 雙穩態電路是一種具有兩個穩定狀態的電路,即在沒有外部輸入信號的情況,電
    的頭像 發表于 08-11 15:00 ?1581次閱讀

    雙穩態觸發器的兩個基本性質是什么

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

    可以單個esp8266上安裝兩個NON OS SDK應用程序嗎?

    ,因為整個解決方案可能很復雜。 我可以想象我會在閃光燈中出現兩個 iroms。此外,我相信第一應用程序的 iram 部分位于 FLASH 的開頭,并在啟動后被復制。 我不確定的是,我怎樣才能設法將第二
    發表于 07-19 07:28

    紅外熱成像與微光夜視優劣對比

    現代科技發展的驅動,人類已經不再對夜晚和低光環境無能為力。尤其是夜視安全等領域,夜視技術的應用尤為重要。其中,紅外熱成像和微光夜視是種最主要的夜視技術。這
    的頭像 發表于 07-03 16:05 ?593次閱讀
    紅外熱成像與微光夜視<b class='flag-5'>優劣</b>勢<b class='flag-5'>對比</b>

    大數據軍事方面的應用有哪些

    智慧華盛恒輝大數據軍事方面的應用涵蓋了多個方面,這些應用不僅提高了軍事管理的效率和水平,也極大地提升了軍隊的作戰能力和情報獲取能力。以下是大數據軍事
    的頭像 發表于 06-23 10:34 ?1063次閱讀

    GEN5 NVME硬盤RAID的性能比較

    解決方案包含兩個核心元素:GPU 和軟件定義存儲 (SDS) 堆棧。 與 RAID 卡一樣,GPU 將大部分硬盤管理和數據保護任務從 CPU 中分離出來,從
    發表于 05-27 17:41 ?1470次閱讀
    <b class='flag-5'>在</b>GEN5 NVME硬盤<b class='flag-5'>下</b>RAID的<b class='flag-5'>性能</b>比較

    Redis為什么這么快?

    Redis 是基于內存的數據庫,那不可避免的就要與磁盤數據庫做對比。對于磁盤數據庫來說,是需要將數據讀取到內存里的,這個過程會受到磁盤 I/O 的限制。而對于內存數據庫來說,本身數據就存在于內存里,也就沒有了這方面的開銷。
    發表于 04-12 10:32 ?221次閱讀
    <b class='flag-5'>Redis</b>為什么這么快?

    GaussDB(for Redis) 特性揭秘:多租戶管理

    級鑒權能力,即可約束每個賬號可訪問的數據庫(DB)范圍,避免誤操作其他租戶數據。該特性可以幫助企業共享 Redis 實例的情況,保護不同租戶的數據安全,為企業的開發和管理提供便利。 哪些用戶需要使用多租戶功能? 多租戶是數
    的頭像 發表于 03-28 22:06 ?757次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:多租戶管理

    fpga通信方面的應用

    FPGA通信方面的應用非常廣泛,以下是一些主要的應用場景。
    的頭像 發表于 03-27 14:10 ?1147次閱讀

    arcgis中如何關聯兩個屬性表

    ArcGIS中,關聯兩個屬性表是一重要的操作,可以通過此操作將兩個表中的數據關聯起來,以便進行分析和查詢。下面是詳細介紹如何在ArcGIS中實現屬性表的關聯。 首先,我們需要明確
    的頭像 發表于 02-25 11:01 ?4330次閱讀
    主站蜘蛛池模板: 国产无限资源| 中文字幕成人乱码在线电影| 亚洲香蕉影视在线播放| 成 人 免费 黄 色 视频| 97人人艹| 韩国免费人成在线观看网站| 色视频在线观看在线播放| 老师受不了了好硬好大| 91久久福利国产成人精品| 天天天天做夜夜夜做| 国产精品三级在线| 日韩三级精品| 午夜大片免费完整在线看| 国产精品美女自在线观看免费| 丁香5月婷婷| 韩国三级中文| 爱爱的免费视频| 国产精品久久久久久久久免费hd| 91成人免费在线视频| 91日韩精品天海翼在线观看| 天天做天天爱夜夜大爽完整| 超级乱淫小黄文小说| 男男全肉高h腐文| 精品精品国产自在久久高清| 丁香六月综合激情| 欧美xingai| 欧洲三级网站| 黄网站观看| 男人搡女人视频免费看| 视频在线观看一区二区三区| 射在老师的里面真爽| 日本加勒比一区| 性色视频在线| 特级生活片| 色播五月婷婷| 日本免费人成在线网站| 日韩卡1卡2卡三卡四卡二卡免| 精品xxxxxbbbb欧美中文| 第四色亚洲色图| 日本全黄视频| 国产高清一级在线观看|