Redis Redis是什麼 為什麼這麼快

2021-10-09 08:53:57 字數 1920 閱讀 7303

完全基於記憶體,將資料儲存在記憶體中,讀取的時候不需要進行磁碟的 io

reids的瓶頸是記憶體以及網路,之前單執行緒實現是因為單執行緒實現簡單

採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu

這是歷史遺留問題,以前伺服器的配置低,單執行緒實現簡單而且效果差不多,現在伺服器的配置普遍提公升,redis已經開始做多執行緒,效能提公升了數倍

高效的資料結構,redis 是用 c 語言開發完成的,但在 redis 字串中,並沒有使用 c 語言中的字串,而是用一種稱為 sds(****** dynamic string)的結構體來儲存字串

struct sdshdr
①常數時間內獲得字串長度

c 字串本身不記錄長度資訊,每次獲取長度資訊都需要遍歷整個字串,複雜度為 o(n);c 字串遍歷時遇到 『\0』 時結束。

sds 中 len 字段儲存著字串的長度,所以總能在常數時間內獲取字串長度,複雜度是 o(1)。

②避免緩衝區溢位

假設在記憶體中有兩個緊挨著的兩個字串,s1=「***xx」和 s2=「yyyyy」。

由於在記憶體上緊緊相連,當我們對 s1 進行擴充的時候,將 s1=「***xxzzzzz」後,由於沒有進行相應的記憶體重新分配,導致 s1 把 s2 覆蓋掉,導致 s2 被莫名其妙的修改。

但 sds 的 api 對 zfc 修改時首先會根據free檢查空間是否足夠,若不充足則會分配新空間,避免了緩衝區溢位問題。

③減少字串修改時帶來的記憶體重新分配的次

如果不小心忘記,有可能會導致記憶體溢位或記憶體洩漏,對於 redis 來說,本身就會很頻繁的修改字串,所以使用 c 字串並不合適。而 sds 實現了空間預分配和惰性空間釋放兩種優化策略:

**空間預分配:**當 sds 的 api 對乙個 sds 修改後,並且對 sds 空間擴充時,程式不僅會為 sds 分配所需要的必須空間,還會分配額外的未使用空間。

分配規則如下:如果對 sds 修改後,len 的長度小於 1m,那麼程式將分配和 len 相同長度的未使用空間。舉個例子,如果 len=10,重新分配後,buf 的實際長度會變為 10(已使用空間)+10(額外空間)+1(空字元)=21。如果對 sds 修改後 len 長度大於 1m,那麼程式將分配 1m 的未使用空間。

④二進位制安全

在 redis 中不僅可以儲存 string 型別的資料,也可能儲存一些二進位制資料。

二進位制資料並不是規則的字串格式,其中會包含一些特殊的字元如 『\0』,在 c 中遇到 『\0』 則表示字串的結束,但在 sds 中,標誌字串結束的是 len 屬性。

rdb 將某個時間點的所有資料都存放到硬碟上

​ 如果系統發生故障,將會丟失最後一次建立快照之後的資料。

​ 如果資料量很大,儲存快照的時間會很長

​ 隨著伺服器寫請求的增多,aof 檔案會越來越大

快取穿透:就是客戶持續向伺服器發起對不存在伺服器中資料的請求。客戶先在redis中查詢,查詢不到後去資料庫中查詢。

介面層增加校驗,對傳參進行個校驗,比如說我們的id是從1開始的,那麼id<=0的直接攔截;

快取中取不到的資料,在資料庫中也沒有取到,這時可以將key-value對寫為key-null,這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊

快取擊穿:就是乙個很熱門的資料,突然失效,大量請求到伺服器資料庫中

​ 最好的辦法就是設定熱點資料永不過期

快取雪崩:就是大量資料同一時間失效。

​ 快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。

python 爬蟲是什麼 python爬蟲什麼意思

python爬蟲指的是python網路爬蟲,又被稱為網頁蜘蛛,網路機械人,是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼,另外一些不常使用的名字還有螞蟻 自動索引 模擬程式或者蠕蟲。簡單來說網際網路是由乙個個站點和網路裝置組成的大網,我們通過瀏覽器訪問站點,站點把html js cs...

技校畢業是什麼學歷 技校畢業後是什麼學歷什麼文憑

技校畢業生是什麼學歷?大部分初中 高中畢業生落榜後打算學一門自己喜歡的技術幹自己喜歡的行業,他們無疑選擇了職業技術學校,職業技術學校是以學技術為主的對學歷方面是怎樣的呢?在技校學業結束後高階技工 技師和學歷是什麼關係呢?下面就給大家介紹一下。技工學校畢業證可能是中專,也可能是大專。中技屬於中等教育一...

python 原始碼是什麼 Python 是什麼?

python 是什麼?python是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言,該語言設計具有很強的可讀性,相比其它語言經常使用英文關鍵字和一些標點符號,它更具有特色。python 特點 1.易於學習 python有相對較少的關鍵字,結構簡單,和乙個明確定義的語法,學習起來更加簡...