一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

lhl545545 ? 來(lái)源:電子發(fā)燒友網(wǎng) ? 2018-02-09 13:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

1. Redis是什么

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

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

2. Redis不可能比Memcache快

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

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

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

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

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

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

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

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

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

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

5. 用get/set方式使用Redis

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

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

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

6. 使用aof代替snapshot

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

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

小結(jié)

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

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

    關(guān)注

    0

    文章

    387

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Redis集群部署配置詳解

    Redis集群是一種分布式Redis解決方案,通過(guò)數(shù)據(jù)分片和主從復(fù)制實(shí)現(xiàn)高可用性和橫向擴(kuò)展。集群將整個(gè)數(shù)據(jù)集分割成16384個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。
    的頭像 發(fā)表于 07-17 11:04 ?122次閱讀

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

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹Redis集群的搭建、性能優(yōu)化以及監(jiān)控運(yùn)維的核心技術(shù)。
    的頭像 發(fā)表于 07-08 17:56 ?237次閱讀

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

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

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

    本文首先介紹Redis是什么,然后介紹如何在Omni3576上編譯Redis-8.0.2源碼,以及從源碼編譯、安裝Redis,最后介紹如何在Omni3576上運(yùn)行Redis性能測(cè)試,并
    發(fā)表于 06-03 01:28

    Redis 再次開(kāi)源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開(kāi)源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?404次閱讀

    redis三種集群方案詳解

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

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

    在目前的技術(shù)選型中,Redis 儼然已經(jīng)成為了系統(tǒng)高性能緩存方案的事實(shí)標(biāo)準(zhǔn),因此現(xiàn)在?Redis 也成為了后端開(kāi)發(fā)的基本技能樹(shù)之一。 ? 基于上述情況,今天給大家分享一份?杰哥?親筆撰寫(xiě)的內(nèi)部
    的頭像 發(fā)表于 02-09 09:12 ?394次閱讀
    <b class='flag-5'>Redis</b>實(shí)戰(zhàn)筆記

    華為云 Flexus X 加速 Redis 案例實(shí)踐與詳解

    Redis 加速鏡像,更是為開(kāi)發(fā)者提供了極大的便利。本文將詳細(xì)介紹如何利用華為云 Flexus X 實(shí)例自帶的 Redis 鏡像,快速部署并配置 Redis,以及通過(guò)實(shí)際案例展示其便捷性和高效性。 一、華為云 Flexus
    的頭像 發(fā)表于 01-23 17:52 ?337次閱讀
    華為云 Flexus X 加速 <b class='flag-5'>Redis</b> 案例實(shí)踐與詳解

    Redis Cluster之故障轉(zhuǎn)移

    1. Redis Cluster 簡(jiǎn)介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實(shí)現(xiàn) Redis
    的頭像 發(fā)表于 01-20 09:21 ?896次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉(zhuǎn)移

    漏電開(kāi)關(guān)使用誤區(qū)及糾正

    漏電開(kāi)關(guān)是現(xiàn)代電氣安全中不可或缺的一部分,它能夠在檢測(cè)到漏電時(shí)迅速切斷電源,從而保護(hù)人身安全和設(shè)備不受損害。然而,在實(shí)際使用過(guò)程中,由于對(duì)漏電開(kāi)關(guān)的認(rèn)識(shí)不足或操作不當(dāng),常常會(huì)出現(xiàn)一些誤區(qū)誤區(qū)
    的頭像 發(fā)表于 12-30 17:18 ?758次閱讀

    華為云Flexus X實(shí)例,Redis性能加速評(píng)測(cè)及對(duì)比

    隨著云計(jì)算技術(shù)的飛速發(fā)展,Redis 作為一種高性能的內(nèi)存數(shù)據(jù)庫(kù),在各種應(yīng)用場(chǎng)景中發(fā)揮著越來(lái)越重要的作用。為了滿足不同用戶對(duì) Redis 性能的高要求,華為云推出了 Flexus X 實(shí)例,并提供了
    的頭像 發(fā)表于 12-29 15:47 ?499次閱讀
    華為云Flexus X實(shí)例,<b class='flag-5'>Redis</b>性能加速評(píng)測(cè)及對(duì)比

    DFT的常見(jiàn)誤區(qū)與解決方案

    DFT(離散傅里葉變換)在信號(hào)處理領(lǐng)域具有廣泛的應(yīng)用,但在使用過(guò)程中也常會(huì)遇到一些誤區(qū)。以下是對(duì)DFT常見(jiàn)誤區(qū)的總結(jié)以及相應(yīng)的解決方案: 常見(jiàn)誤區(qū) 混疊現(xiàn)象 : 誤區(qū)描述:在采樣過(guò)程中
    的頭像 發(fā)表于 12-20 09:32 ?1392次閱讀

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內(nèi)存數(shù)據(jù)存儲(chǔ)系統(tǒng),它們主要用于提高應(yīng)用程序的性能,通過(guò)減少對(duì)數(shù)據(jù)庫(kù)的直接訪問(wèn)來(lái)加速數(shù)據(jù)檢索。以下是對(duì)Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發(fā)表于 12-18 09:33 ?595次閱讀

    編程語(yǔ)言的誤區(qū)與常見(jiàn)問(wèn)題

    : 選擇編程語(yǔ)言時(shí),應(yīng)考慮項(xiàng)目需求、個(gè)人興趣以及語(yǔ)言的適用性。例如,如果你對(duì)Web開(kāi)發(fā)感興趣,那么學(xué)習(xí)JavaScript可能是一個(gè)好選擇。 認(rèn)識(shí)到?jīng)]有一種編程語(yǔ)言是萬(wàn)能的。不同的語(yǔ)言有不同的優(yōu)勢(shì)和適用場(chǎng)景,靈活選擇是關(guān)鍵。 誤區(qū)二:忽
    的頭像 發(fā)表于 11-15 09:35 ?752次閱讀

    認(rèn)識(shí)差分信號(hào)的常見(jiàn)誤區(qū)

    差分信號(hào)因其優(yōu)異的抗干擾性能和良好的信號(hào)完整性而被廣泛應(yīng)用。然而,圍繞差分信號(hào)的認(rèn)識(shí)卻存在一些常見(jiàn)的誤區(qū)。為了幫助設(shè)計(jì)工程師更好地理解和應(yīng)用差分信號(hào),本文將針對(duì)這些誤區(qū)進(jìn)行詳細(xì)解析。 1. 回流路徑
    的頭像 發(fā)表于 10-04 14:48 ?787次閱讀