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

關于Redis的幾個認識誤區(qū)

  前幾天新浪微博發(fā)生了一起大的系統(tǒng)故障,很多搞技術的朋友都比較關心,其中的原因不會超出James Hamilton在On Designing and Deploying InterNET-Scale Service概括的那幾個范圍,James第一條經(jīng)驗“Design for failure”是所有互聯(lián)網(wǎng)架構成功的一個關鍵。互聯(lián)網(wǎng)系統(tǒng)的工程理論其實非常簡單,James paper中內容幾乎稱不上理論,而是多條實踐經(jīng)驗分享,每個公司對這些經(jīng)驗的理解及執(zhí)行力決定了架構成敗。

  題外話說完,最近又研究了Redis。去年曾做過一個MemcacheDB, Tokyo Tyrant, Redis performance test,到目前為止,這個benchmark結果依然有效。這1年我們經(jīng)歷了很多眼花繚亂的keyvalue存儲產品的誘惑,從Cassandra的淡出(Twitter暫停在主業(yè)務使用)到HBase的興起(Facebook新的郵箱業(yè)務選用HBase),當再回頭再去看Redis,發(fā)現(xiàn)這個只有1萬多行源代碼的程序充滿了神奇及大量未經(jīng)挖掘的特性。Redis性能驚人,國內前十大網(wǎng)站的子產品估計用1臺Redis就可以滿足存儲及Cache的需求。除了性能印象之外,業(yè)界其實普遍對Redis的認識存在一定誤區(qū)。本文提出一些觀點供大家探討。

  1. Redis是什么

  這個問題的結果影響了我們怎么用Redis。如果你認為Redis是一個key value store, 那可能會用它來代替MySQL;如果認為它是一個可以持久化的cache, 可能只是它保存一些頻繁訪問的臨時數(shù)據(jù)。Redis是REmote DIctionary Server的縮寫,在Redis在官方網(wǎng)站的的副標題是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支持復雜的數(shù)據(jù)特性,比如List, Set等。對Redis的作用的不同解讀決定了你對Redis的使用方式。

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

  2. Redis不可能比Memcache快

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

  • Libevent。和Memcached不同,Redis并沒有選擇libevent。Libevent為了迎合通用性造成代碼龐大(目前Redis代碼還不到libevent的1/3)及犧牲了在特定平臺的不少性能。Redis用libevent中的兩個文件修改實現(xiàn)了自己的epoll event loop。業(yè)界不少開發(fā)者也建議Redis使用另外一個libevent高性能替代libev,但是作者還是堅持Redis應該小巧并去依賴的思路。一個印象深刻的細節(jié)是編譯Redis之前并不需要執(zhí)行./configure。
  • CAS問題。CAS是Memcached中比較方便的一種防止競爭修改資源的方法。CAS實現(xiàn)需要為每個cache key設置一個隱藏的cas token,cas相當value版本號,每次set會token需要遞增,因此帶來CPU和內存的雙重開銷,雖然這些開銷很小,但是到單機10G+ cache以及QPS上萬之后這些開銷就會給雙方相對帶來一些細微性能差別。

  3. 單臺Redis的存放數(shù)據(jù)必須比物理內存小

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

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

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

  4. Redis的VM實現(xiàn)是重復造輪子

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

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

  5. 用get/set方式使用Redis

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

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

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

  6. 使用aof代替snapshot

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

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

  小結

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

  參考文獻

  1. On Designing and Deploying InterNET-Scale Service(PDF)
  2. Facebook’s New Real-Time Messaging System: HBase To Store 135+ Billion Messages A Month
  3. What’s wrong with 1975 programming
  4. Linux epoll is now supported(Google Groups)
  5. CAS and why I don’t want to add it to Redis(Google Groups)
  6. Plans for Virtual Memory(Google Groups)
  7. Full of keys(Salvatore antirez Sanfilippo)

it知識庫關于Redis的幾個認識誤區(qū),轉載需保留來源!

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

主站蜘蛛池模板: 久久综久久美利坚合众国 | 亚洲无人区码二码三码区别图 | 亚洲AV色香蕉一区二区三区 | 青青青久久久 | 天美传媒在线观看免费完整版 | 国产盗摄一区二区三区 | 中文字幕午夜乱理片 | 国产免费人成在线视频有码 | 97在线看视频福利免费 | 国产成人免费在线 | 琪琪伦伦影院理论片 | 秘密教学26我们在做一次吧免费 | XXX国产麻豆HD | 免费的av不用播放器的 | 老湿机一区午夜精品免费福利 | 狠狠婷婷综合久久久久久 | 成人无码精品1区2区3区免费看 | 成 人 网 站毛片 | 亚洲国产日韩a精品乱码 | 精品免费久久久久久影院 | 99er久久国产精品在线 | 在线 | 果冻国产传媒61国产免费 | 在线 国产 欧美 专区 | 男人狂躁进女人免费视频公交 | 国产精品久久久久久AV免费不卡 | 4438成人情人网站 | 入室强伦女教师被学生 | 暖暖在线观看播放视频 | 99精品国产电影 | 無码一区中文字幕少妇熟女网站 | 色婷婷国产精品视频一区二区 | CHINA篮球体育飞机2022网站 | 国产成人精选免费视频 | 久久久久久免费观看 | a视频免费看 | 国产亚洲精品视频亚洲香蕉视 | 男人网站在线观看 | 欧美性猛交XXXX乱大交极品 | 久久久国产精品免费A片蜜臀 | 十分钟免费看完整视频 | 18禁止看的免费污网站 |