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

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

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

redis幾個認(rèn)識誤區(qū)

lhl545545 ? 來源:電子發(fā)燒友網(wǎng) ? 2018-02-09 13:46 ? 次閱讀

前言

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

1. Redis是什么

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

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

2. Redis不可能比Memcache快

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

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

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

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

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

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

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

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

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

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

5. 用get/set方式使用Redis

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

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

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

6. 使用aof代替snapshot

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

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

小結(jié)

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

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

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評論

    相關(guān)推薦

    必看!光伏并網(wǎng)逆變器的3個典型認(rèn)識誤區(qū)

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

    Redis開源版與Redis企業(yè)版,怎么選用?

    點(diǎn)擊“藍(lán)字”關(guān)注我們數(shù)以千計的企業(yè)和數(shù)以百萬計的開發(fā)人員Redis開源版來構(gòu)建應(yīng)用程序。但隨著用戶數(shù)量、數(shù)據(jù)量和地區(qū)性的增加,成本、可擴(kuò)展性、運(yùn)營和可用性等問題也隨之而來。Redis企業(yè)版
    的頭像 發(fā)表于 04-04 08:04 ?695次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業(yè)版,怎么選用?

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

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

    低功耗設(shè)計的幾個誤區(qū)分享

    誤區(qū)一:我們這系統(tǒng)是220V供電,就不用在乎功耗問題了 點(diǎn)評:低功耗設(shè)計并不僅僅是為了省電,更多的好處在于降低了電源模塊及散熱系統(tǒng)的成本、由于電流的減小也減少了電磁輻射和熱噪聲的干擾。隨著設(shè)備
    發(fā)表于 01-09 08:04

    redis容器內(nèi)怎么查看redis日志

    redis是一款流行的開源內(nèi)存數(shù)據(jù)庫,常用于緩存、消息隊列、任務(wù)管理等場景。在使用redis時,了解如何查看redis日志對于排查問題、監(jiān)控性能和分析應(yīng)用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發(fā)表于 12-05 10:10 ?2923次閱讀

    redis的lru原理

    Redis是一種基于內(nèi)存的鍵值數(shù)據(jù)庫,它使用了LRU(Least Recently Used)算法來進(jìn)行緩存的數(shù)據(jù)淘汰。LRU算法的核心思想是最近最少使用的數(shù)據(jù)將會在未來也不常用,因此應(yīng)該優(yōu)先
    的頭像 發(fā)表于 12-05 09:56 ?524次閱讀

    redis的原理和使用場景

    、消息隊列、實時分析、排行榜和計數(shù)器等場景。本文將詳細(xì)介紹Redis的原理和使用場景。 一、Redis的原理 Redis的原理主要包括以下幾個方面: 內(nèi)存數(shù)據(jù)庫:
    的頭像 發(fā)表于 12-04 16:29 ?487次閱讀

    redis的淘汰策略

    Redis是一種基于內(nèi)存的鍵值存儲系統(tǒng),為了充分利用內(nèi)存,Redis采用了一些淘汰策略來管理內(nèi)存空間。淘汰策略的作用是當(dāng)內(nèi)存空間不足時,選擇合適的數(shù)據(jù)對象進(jìn)行淘汰,釋放出更多的內(nèi)存空間,以供后續(xù)
    的頭像 發(fā)表于 12-04 16:23 ?457次閱讀

    java redis鎖處理并發(fā)代碼

    問題。 本文將詳細(xì)介紹如何在Java代碼中使用Redis實現(xiàn)并發(fā)代碼的鎖處理。我們將分為以下幾個方面來討論: Redis分布式鎖的原理 Redis分布式鎖的實現(xiàn)方式 在Java中使用
    的頭像 發(fā)表于 12-04 11:04 ?755次閱讀

    Java redis鎖怎么實現(xiàn)

    在Java中實現(xiàn)Redis鎖涉及到以下幾個方面:Redis的安裝配置、Redis連接池的使用、Redis數(shù)據(jù)結(jié)構(gòu)的選擇、實現(xiàn)分布式鎖的幾種方
    的頭像 發(fā)表于 12-04 10:47 ?906次閱讀

    關(guān)于圖像傳感器圖像質(zhì)量的四大誤區(qū)!你踩過幾個坑?

    關(guān)于圖像傳感器圖像質(zhì)量的四大誤區(qū)!你踩過幾個坑?
    的頭像 發(fā)表于 11-27 16:56 ?343次閱讀
    關(guān)于圖像傳感器圖像質(zhì)量的四大<b class='flag-5'>誤區(qū)</b>!你踩過<b class='flag-5'>幾個</b>坑?

    避免在高低溫試驗箱選購中走入誤區(qū)幾個關(guān)鍵點(diǎn)

    避免在高低溫試驗箱選購中走入誤區(qū)幾個關(guān)鍵點(diǎn)
    的頭像 發(fā)表于 10-26 10:27 ?324次閱讀
    避免在高低溫試驗箱選購中走入<b class='flag-5'>誤區(qū)</b>的<b class='flag-5'>幾個</b>關(guān)鍵點(diǎn)

    認(rèn)識一下幾個常用的門級電路

    標(biāo)準(zhǔn)單元庫是數(shù)字集成電路的積木,是復(fù)雜電路和系統(tǒng)的基礎(chǔ)。今天我們來認(rèn)識一下其中的幾個常用門級電路。
    的頭像 發(fā)表于 10-09 15:49 ?1105次閱讀
    <b class='flag-5'>認(rèn)識</b>一下<b class='flag-5'>幾個</b>常用的門級電路

    Redis中的使用

    Redis 作為內(nèi)存的存儲中間件,已經(jīng)是面試的面試題必問之一了,今天一起來看看 Redis 的事務(wù)吧。 事務(wù)提供了一種"將多個命令打包,一次性提交并按順序執(zhí)行"的機(jī)制,提交后在事務(wù)執(zhí)行中不會
    的頭像 發(fā)表于 10-08 15:27 ?398次閱讀
    <b class='flag-5'>Redis</b>中的使用

    如何用Springboot整合Redis

    本篇文件我們來介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創(chuàng)建配置文件
    的頭像 發(fā)表于 10-08 14:56 ?485次閱讀
    如何用Springboot整合<b class='flag-5'>Redis</b>