redis實(shí)戰(zhàn)讀后感

這個月粗略的讀了一下《redis實(shí)戰(zhàn)》這本書,學(xué)習(xí)了一下日常的操作命令,以及它的一些高階操作之外,感觸頗多,以下是對感興趣深入的幾章的深入和擴(kuò)展閱讀。

1. redis為什么這么快?

Redis采用的是基于內(nèi)存的采用的是單進(jìn)程單線程模型的 KV 數(shù)據(jù)庫,由C語言編寫,官方提供的數(shù)據(jù)是可以達(dá)到100000+的QPS(每秒內(nèi)查詢次數(shù))。除了書中介紹的,單線程、單獨(dú)設(shè)計(jì)了數(shù)據(jù)結(jié)構(gòu)、使用了不同的底層模型,其中有一點(diǎn),I/O多路復(fù)用,我稍微深入地了解了一下。

I/O多路復(fù)用(multiplexing)

多路I/O復(fù)用模型是利用 select、poll、epoll 可以同時監(jiān)察多個流的 I/O 事件的能力,在空閑的時候,會把當(dāng)前線程阻塞掉,當(dāng)有一個或多個流有 I/O 事件時,就從阻塞態(tài)中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流),并且只依次順序的處理就緒的流。
就好比一個老師,讓30個學(xué)生解答一道題目,然后檢查學(xué)生做的是否正確,你站在講臺上等,誰解答完誰舉手。這時C、D舉手,表示他們解答問題完畢,你下去依次檢查C、D的答案,然后繼續(xù)回到講臺上等。此時E、A又舉手,然后去處理E和A。。。 這種就是IO復(fù)用模型,Linux下的select、poll和epoll就是干這個的。將用戶socket對應(yīng)的fd注冊進(jìn)epoll,然后epoll幫你監(jiān)聽哪些socket上有消息到達(dá),這樣就避免了大量的無用操作。此時的socket應(yīng)該采用非阻塞模式。

2. redis如何降低內(nèi)存占用?

壓縮列表

Redis對于每種數(shù)據(jù)結(jié)構(gòu)、無論是列表、哈希表還是有序集合,在決定是否應(yīng)用壓縮列表作為當(dāng)前數(shù)據(jù)結(jié)構(gòu)類型的底層編碼的時候都會依賴一個開關(guān)和一個閾值,開關(guān)用來決定我們是否要啟用壓縮列表編碼,閾值總的來說通常指當(dāng)前結(jié)構(gòu)存儲的key數(shù)量有沒有達(dá)到一個數(shù)值(條件),或者是value值長度有沒有達(dá)到一定的長度(條件)。任何策略都有其應(yīng)用場景,不同場景應(yīng)用不同策略。為什么當(dāng)前結(jié)構(gòu)存儲的數(shù)據(jù)條目達(dá)到一定數(shù)值使用壓縮列表就不好?壓縮列表的新增、刪除的操作平均時間復(fù)雜度為O(N),隨著N的增大,時間必然會增加,他不像哈希表可以以O(shè)(1)的時間復(fù)雜度找到存取位置,然而在一定N內(nèi)的時間復(fù)雜度我們可以容忍。然而壓縮列表利用巧妙的編碼技術(shù)除了存儲內(nèi)容盡可能的減少不必要的內(nèi)存開銷,將數(shù)據(jù)存儲于連續(xù)的內(nèi)存區(qū)域,這對于Redis本身來說是有意義的,因?yàn)镽edis是一款內(nèi)存數(shù)據(jù)庫軟件,想辦法盡可能減少內(nèi)存的開銷是Redis設(shè)計(jì)者一定要考慮的事情。
另外,經(jīng)過仔細(xì)琢磨,我認(rèn)為使用壓縮列表的好處除了節(jié)約內(nèi)存之外,還有減少內(nèi)存碎片的作用,我把這種行為叫做"合并存儲",也就是將很多小的數(shù)據(jù)塊存儲在一個比較大的內(nèi)存區(qū)域,試想想,如果我們將要存儲的數(shù)據(jù)都是很小的條目,我們?yōu)槊恳粋€數(shù)據(jù)條目都單獨(dú)的申請內(nèi)存,結(jié)果是這些條目將有可能分散在內(nèi)存的每一個角落,最終導(dǎo)致碎片增加,這是一件令人頭疼的事情。

分片式散列

分片本質(zhì)上就是基于某些簡單的規(guī)則,將數(shù)據(jù)劃分為更小的部分,然后根據(jù)數(shù)據(jù)所屬的部分來決定將數(shù)據(jù)分配到哪或者從哪獲取數(shù)據(jù)。而Redis分片就是將數(shù)據(jù)拆分到多個Redis服務(wù)器的過程,這樣每個Redis服務(wù)器將只存儲原數(shù)據(jù)的子集。
Redis分片的作用:

  • 允許使用很多電腦的內(nèi)存總和來支持更大的數(shù)據(jù)庫。沒有分片,你就被局限于單機(jī)能支持的內(nèi)存容量。
  • 允許伸縮計(jì)算能力到多核或多服務(wù)器,伸縮網(wǎng)絡(luò)帶寬到多服務(wù)器或多網(wǎng)絡(luò)適配器。

Redis分片的方式:
??假設(shè)我們有4個Redis服務(wù)器R0,R1,R2,R3,還有很多表示用戶的鍵,像user:1,user:2....,我們能找到不同的方式來選擇一個指定的鍵存儲在哪個服務(wù)器中。換句話說,有許多不同的辦法來映射一個鍵到一個指定的Redis服務(wù)器。 ??最簡單的執(zhí)行分片的方式之一是范圍分片(range partitioning),通過映射對象的范圍到指定的Redis實(shí)例來完成分片。例如,我可以假設(shè)用戶從ID 0到ID 10000進(jìn)入實(shí)例R0,用戶從ID 10001到ID 20000進(jìn)入實(shí)例R1。 ??這套辦法行得通,然而,這樣做有一個缺點(diǎn),就是需要一個映射范圍到實(shí)例的表格。這張表需要管理,不同類型的對象都需要一個表,所以范圍分片在Redis中并不經(jīng)常使用,因?yàn)檫@要比其它分片可選方案低效得多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 微博及 Twitter 這兩大社交平臺都重度依賴 Redis 來承載海量用戶訪問。本文介紹如何使用 Redis 來...
    龍權(quán)閱讀 51,042評論 2 4
  • 前言 Redis是目前最火爆的內(nèi)存數(shù)據(jù)庫之一,通過在內(nèi)存中讀寫數(shù)據(jù),大大提高了讀寫速度,可以說Redis是實(shí)現(xiàn)網(wǎng)站...
    小陳阿飛閱讀 890評論 0 1
  • 一日,學(xué)生游至天堂寺(甘肅古浪境,藏傳),天晚,寺閉;學(xué)生與僧言:佛未拒,而何耳獨(dú)拒之?僧曰:佛固未拒,而僧有課業(yè)...
    Chi李學(xué)生閱讀 653評論 0 5
  • 車窗外景色飛逝,內(nèi)心卻是另一番斑駁。雨后太陽初晴,微風(fēng)夾雜著泥土的清香透過車窗吹過發(fā)絲。發(fā)動機(jī)的轟鳴和人語的嘈雜,...
    七弦桐語閱讀 314評論 0 1
  • 網(wǎng)上看到這個問題的Blog,看到他的解答:cnblogs 分析一下這個算法的復(fù)雜度,如果n=xa*yb*z^c,循...
    jcjview閱讀 1,434評論 0 1

友情鏈接更多精彩內(nèi)容