吴忠躺衫网络科技有限公司

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

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

3天內不再提示

redis幾個認識誤區

lhl545545 ? 來源:電子發燒友網 ? 2018-02-09 13:46 ? 次閱讀

前言

Redis性能驚人,國內前十大網站的子產品估計用1臺Redis就可以滿足存儲及Cache的需求。除了性能印象之外,業界其實普遍對Redis的認識存在一定誤區。下文是對對Redis研究的一個總結,澄清了一些認識上的誤區,提出一些觀點供大家探討。

1. Redis是什么

這個問題的結果影響了我們怎么用Redis。如果你認為Redis是一個key value store, 那可能會用它來代替MySQL;如果認為它是一個可以持久化的cache, 可能只是它保存一些頻繁訪問的臨時數據。Redis是REmote DIctionary Server的縮寫,在Redis在官方網站的的副標題是A persistent key-value database with built-in net interface written in ANSI-C for Posix systems,這個定義偏向key value store。還有一些看法則認為Redis是一個memory database,因為它的高性能都是基于內存操作的基礎。另外一些人則認為Redis是一個data structure server,因為Redis支持復雜的數據特性,比如List, Set等。對Redis的作用的不同解讀決定了你對Redis的使用方式。

互聯網數據目前基本使用兩種方式來存儲,關系數據庫或者key value。但是這些互聯網業務本身并不屬于這兩種數據類型,比如用戶在社會化平臺中的關系,它是一個list,如果要用關系數據庫存儲就需要轉換成一種多行記錄的形式,這種形式存在很多冗余數據,每一行需要存儲一些重復信息。如果用key value存儲則修改和刪除比較麻煩,需要將全部數據讀出再寫入。Redis在內存中設計了各種數據類型,讓業務能夠高速原子的訪問這些數據結構,并且不需要關心持久存儲的問題,從架構上解決了前面兩種存儲需要走一些彎路的問題。

2. Redis不可能比Memcache快

很多開發者都認為Redis不可能比Memcached快,Memcached完全基于內存,而Redis具有持久化保存特性,即使是異步的,Redis也不可能比Memcached快。但是測試結果基本是Redis占絕對優勢。一直在思考這個原因,目前想到的原因有這幾方面。

Libevent。和Memcached不同,Redis并沒有選擇libevent。Libevent為了迎合通用性造成代碼龐大(目前Redis代碼還不到libevent的1/3)及犧牲了在特定平臺的不少性能。Redis用libevent中兩個文件修改實現了自己的epoll event loop(4)。業界不少開發者也建議Redis使用另外一個libevent高性能替代libev,但是作者還是堅持Redis應該小巧并去依賴的思路。一個印象深刻的細節是編譯Redis之前并不需要執行。/configure。

CAS問題。CAS是Memcached中比較方便的一種防止競爭修改資源的方法。CAS實現需要為每個cache key設置一個隱藏的cas token,cas相當value版本號,每次set會token需要遞增,因此帶來CPU和內存的雙重開銷,雖然這些開銷很小,但是到單機10G+ cache以及QPS上萬之后這些開銷就會給雙方相對帶來一些細微性能差別(5)。

3. 單臺Redis的存放數據必須比物理內存小

Redis的數據全部放在內存帶來了高速的性能,但是也帶來一些不合理之處。比如一個中型網站有100萬注冊用戶,如果這些資料要用Redis來存儲,內存的容量必須能夠容納這100萬用戶。但是業務實際情況是100萬用戶只有5萬活躍用戶,1周來訪問過1次的也只有15萬用戶,因此全部100萬用戶的數據都放在內存有不合理之處,RAM需要為冷數據買單。

這跟操作系統非常相似,操作系統所有應用訪問的數據都在內存,但是如果物理內存容納不下新的數據,操作系統會智能將部分長期沒有訪問的數據交換到磁盤,為新的應用留出空間。現代操作系統給應用提供的并不是物理內存,而是虛擬內存(Virtual Memory)的概念。

基于相同的考慮,Redis 2.0也增加了VM特性。讓Redis數據容量突破了物理內存的限制。并實現了數據冷熱分離。

4. Redis的VM實現是重復造輪子

Redis的VM依照之前的epoll實現思路依舊是自己實現。但是在前面操作系統的介紹提到OS也可以自動幫程序實現冷熱數據分離,Redis只需要OS申請一塊大內存,OS會自動將熱數據放入物理內存,冷數據交換到硬盤,另外一個知名的“理解了現代操作系統(3)”的Varnish就是這樣實現,也取得了非常成功的效果。

作者antirez在解釋為什么要自己實現VM中提到幾個原因(6)。主要OS的VM換入換出是基于Page概念,比如OS VM1個Page是4K, 4K中只要還有一個元素即使只有1個字節被訪問,這個頁也不會被SWAP, 換入也同樣道理,讀到一個字節可能會換入4K無用的內存。而Redis自己實現則可以達到控制換入的粒度。另外訪問操作系統SWAP內存區域時block進程,也是導致Redis要自己實現VM原因之一。

5. 用get/set方式使用Redis

作為一個key value存在,很多開發者自然的使用set/get方式來使用Redis,實際上這并不是最優化的使用方法。尤其在未啟用VM情況下,Redis全部數據需要放入內存,節約內存尤其重要。

假如一個key-value單元需要最小占用512字節,即使只存一個字節也占了512字節。這時候就有一個設計模式,可以把key復用,幾個key-value放入一個key中,value再作為一個set存入,這樣同樣512字節就會存放10-100倍的容量。

這就是為了節約內存,建議使用hashset而不是set/get的方式來使用Redis,詳細方法見參考文獻(7)。

6. 使用aof代替snapshot

Redis有兩種存儲方式,默認是snapshot方式,實現方法是定時將內存的快照(snapshot)持久化到硬盤,這種方法缺點是持久化之后如果出現crash則會丟失一段數據。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入內存數據的同時將操作命令保存到日志文件,在一個并發更改上萬的系統中,命令日志是一個非常龐大的數據,管理維護成本非常高,恢復重建時間會非常長,這樣導致失去aof高可用性本意。另外更重要的是Redis是一個內存數據結構模型,所有的優勢都是建立在對內存復雜數據結構高效的原子操作上,這樣就看出aof是一個非常不協調的部分。

其實aof目的主要是數據可靠性及高可用性,在Redis中有另外一種方法來達到目的:Replication。由于Redis的高性能,復制基本沒有延遲。這樣達到了防止單點故障及實現了高可用。

小結

要想成功使用一種產品,我們需要深入了解它的特性。Redis性能突出,如果能夠熟練的駕馭,對國內很多大型應用具有很大幫助。希望更多同行加入到Redis使用及代碼研究行列。

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

    關注

    0

    文章

    378

    瀏覽量

    10944
收藏 人收藏

    評論

    相關推薦

    Redis Cluster之故障轉移

    1. Redis Cluster 簡介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實現 Redis
    的頭像 發表于 01-20 09:21 ?211次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉移

    漏電開關使用誤區及糾正

    漏電開關是現代電氣安全中不可或缺的一部分,它能夠在檢測到漏電時迅速切斷電源,從而保護人身安全和設備不受損害。然而,在實際使用過程中,由于對漏電開關的認識不足或操作不當,常常會出現一些誤區誤區
    的頭像 發表于 12-30 17:18 ?371次閱讀

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

    隨著云計算技術的飛速發展,Redis 作為一種高性能的內存數據庫,在各種應用場景中發揮著越來越重要的作用。為了滿足不同用戶對 Redis 性能的高要求,華為云推出了 Flexus X 實例,并提供了
    的頭像 發表于 12-29 15:47 ?215次閱讀
    華為云Flexus X實例,<b class='flag-5'>Redis</b>性能加速評測及對比

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內存數據存儲系統,它們主要用于提高應用程序的性能,通過減少對數據庫的直接訪問來加速數據檢索。以下是對Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發表于 12-18 09:33 ?241次閱讀

    編程語言的誤區與常見問題

    : 選擇編程語言時,應考慮項目需求、個人興趣以及語言的適用性。例如,如果你對Web開發感興趣,那么學習JavaScript可能是一個好選擇。 認識到沒有一種編程語言是萬能的。不同的語言有不同的優勢和適用場景,靈活選擇是關鍵。 誤區二:忽
    的頭像 發表于 11-15 09:35 ?376次閱讀

    認識差分信號的常見誤區

    差分信號因其優異的抗干擾性能和良好的信號完整性而被廣泛應用。然而,圍繞差分信號的認識卻存在一些常見的誤區。為了幫助設計工程師更好地理解和應用差分信號,本文將針對這些誤區進行詳細解析。 1. 回流路徑
    的頭像 發表于 10-04 14:48 ?391次閱讀

    必看!光伏并網逆變器的3個典型認識誤區

    總是下意識地、第一時間從逆變器入手,去尋找原因和解決方案。在日常交流中發現盡管分布式光伏在國內已經高速發展了多年,但仍然有幾個典型的對逆變器的認識誤區存在。今天就來聊一聊。 01 逆變器輸出電壓嗎? “交流輸出電壓”這
    的頭像 發表于 07-11 16:32 ?1327次閱讀
    必看!光伏并網逆變器的3個典型<b class='flag-5'>認識</b><b class='flag-5'>誤區</b>

    Redis 開源協議調整,我們怎么辦?

    2 024 年 3 月 20 日, Redis 官方宣布,從 Redis 7.4 版本開始,Redis 將獲得源可用許可證 ( RSALv2 ) 和服務器端公共許可證 ( SSPLv1 ) 的雙重
    的頭像 發表于 05-09 22:59 ?474次閱讀
    <b class='flag-5'>Redis</b> 開源協議調整,我們怎么辦?

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?1191次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?

    數據安全沒保障?GaussDB(for Redis) 為你保駕護航

    近日,一些用戶反饋,使用的開源 Redis 中新增了幾個未知來源的 Key。通過分析發現,用戶使用的開源 Redis 沒有設置密碼,很可能是遭到了 Redis 擴散病毒的攻擊,表面上只
    的頭像 發表于 03-28 22:09 ?718次閱讀
    數據安全沒保障?GaussDB(for <b class='flag-5'>Redis</b>) 為你保駕護航

    GaussDB(for Redis) 特性揭秘:大 key 治理

    ? 從 DBA 的視角看,大 Key 無疑是引起 Redis 線上問題的常見原因。為了解決大 Key 隱患,業務首先要遵守合理的開發規范,減少大 Key 的產生和訪問依賴。但有時大 Key 是在程序
    的頭像 發表于 03-28 22:06 ?711次閱讀
    GaussDB(for <b class='flag-5'>Redis</b>) 特性揭秘:大 key 治理

    新版 Redis 不再“開源”,對使用者都有哪些影響?

    2024 年 3 月 20 日,Redis Labs 宣布從 Redis 7.4 開始,將原先比較寬松的 BSD 源碼使用協議修改為 RSAv2和 SSPLv1協議。該變化意味著 Redis
    的頭像 發表于 03-27 22:30 ?556次閱讀
    新版 <b class='flag-5'>Redis</b> 不再“開源”,對使用者都有哪些影響?

    選購安規電容的幾個常見誤區你中了幾個

    安規電容在電子設備中扮演重要角色,但選購時易陷誤區。新手常錯將普通電容當安規電容,忽視品質與認證,不考慮品牌和制造商。選購安規電容應了解性能,選擇品質好的產品,這樣才能確保電子設備工作的穩定性。
    的頭像 發表于 03-25 09:55 ?508次閱讀
    選購安規電容的<b class='flag-5'>幾個</b>常見<b class='flag-5'>誤區</b>你中了<b class='flag-5'>幾個</b>?

    路由器代理商如何避免常見的誤區

    作為路由器代理商,要成功在競爭激烈的市場環境中立足,需對常見誤區保持清醒認識,并制定相應策略避免。從產品定位、渠道選擇和營銷策略等方面剖析,為可持續發展提供指導。
    的頭像 發表于 03-03 16:51 ?490次閱讀

    Redis官方搜索引擎來了,性能炸裂!

    RediSearch 是一個 Redis 模塊,為 Redis 提供查詢、二級索引和全文搜索功能。
    的頭像 發表于 02-21 10:01 ?2538次閱讀
    <b class='flag-5'>Redis</b>官方搜索引擎來了,性能炸裂!
    百家乐官网直杀| 海尔百家乐官网的玩法技巧和规则| 百家乐庄家出千内幕| 真人百家乐官网宣传| 盐城百家乐的玩法技巧和规则| 合肥百家乐官网赌博机| 威尼斯人娱乐场it| 百家乐官网娱乐网77scs| 玩百家乐高手支招篇| 开花财国际| 百家乐官网心得打法| bet365 官网| 百家乐电子| 百家乐专业豪华版| 精英百家乐现金网| bet365外围| 百家乐官网博之道娱乐城| 星河百家乐的玩法技巧和规则| 百家乐官网解密软件| 大发888官方lc8| 玩百家乐游戏经验| 百家乐官网分析软件骗人| 大发888娱乐场存款168| 百家乐出庄概率| 百家乐官网去哪里玩最好| 大发888老虎机下载| 百家乐压分规律| 百家乐官网折叠桌| 太阳城娱乐管理网| 做生意的门市风水| 百家乐官网在线怎么玩| 大发888娱乐城casino| 顶尖百家乐开户| 百家乐官网2号机器投注技巧 | 真人百家乐试玩游戏| 百家乐官网桌台布| 香港六合彩官方| 百家乐真人游戏赌场娱乐网规则| 百家乐官网庄闲点| 金道百家乐官网游戏| 大发888娱乐城m88|