天天看點

Redis 基礎知識介紹

海量使用者+高并發,會造成伺服器癱瘓,主要原因就是使用的是關系型資料庫

1.性能瓶頸:磁盤IO性能低下

關系型資料庫存取資料的時候是要通過磁盤IO的。磁盤的性能本身是比較低的

2.擴充瓶頸:資料關系複雜,擴充性差,不便于大規模叢集

關系型資料庫表與表的關系非常複雜,十分影響查詢效率,這個情況下,進行擴充也是十分困難的

1.降低磁盤IO次數,越低越好

使用記憶體存儲,大大提高效率

2.去除資料間的關系,越簡單越好

去除關系,隻存資料

這就是NoSql

NoSQL:即 Not-Only SQL( 泛指非關系型的資料庫),作為關系型資料庫的補充。 作用:應對基于海量使用者和海量資料前提下的資料處理問題。

特征

可擴容,可伸縮,大資料量下高性能,直接對記憶體進行操作

靈活的資料模型、高可用。自己設計了資料存儲格式,保證效率比較高。

常見NoSql資料庫

Redis、memcache、HBase、MongoDB

概念:Redis (REmote DIctionary Server) 是用 C 語言開發的一個開源的高性能鍵值對(key-value)資料庫。

1.資料間沒有必然的關聯關系

2.内部采用單線程機制進行工作

3.高性能。官方提供測試資料,50個并發執行100000 個請求,讀的速度是110000 次/s,寫的速度是81000次/s。

4.多資料類型支援

字元串類型,string list

清單類型,hash set

散列類型,zset/sorted_set

集合類型

有序集合類型

5.支援持久化,可以進行資料災難恢複

1.為熱點資料加速查詢(主要場景)。如熱點商品,熱點新聞,熱點資訊,推廣類等高通路量資訊等

2.即時資訊查詢。如各類排行榜、各類網站通路統計、公交到站資訊、線上人數資訊(聊天室、網站)、裝置信号等

3.時效性資訊控制。如驗證碼控制,投票控制等。

4.分布式資料共享。如分布式叢集架構中的session分離

5.消息隊列--已經弱化

利用永久性存儲媒體将資料進行儲存,在特定的時間将儲存的資料進行恢複的工作機制成為持久化

持久化用于防止資料的意外丢失,確定資料安全性

将目前資料狀态進行儲存,快照形式,存儲資料結果,存儲格式簡單,關注點在資料---RDB

将資料的操作過程進行儲存,日志形式,存儲操作過程,存儲格式複雜,關注點在資料的操作過程---AOF

sava指令

reids是單線程的,多台用戶端同時操作redis會建立一個任務隊列,save指令的執行會阻塞目前的redis伺服器,直到目前RDB過程完成為止,有可能長時間阻塞,線上環境不建議使用

bgsave指令

1.指令bgsave指令,會先向redis發送指令

2.redis會傳回一個背景儲存開始執行 的消息

3.redis會去調用fork函數生成一個子程序

4.然後去建立rdb檔案

5.最終redis傳回執行結果

注意:bgsave指令是針對save阻塞問題做的優化,redis内部所有涉及到RDB的操作都使用bgsave指令進行操作,save指令可以放棄使用

Redis 基礎知識介紹

save配置

設定自動持久化的條件,滿足限定時間範圍内key的變化數量達到指定數量即進行持久化

從redis啟動開始,如果十秒内key變化2次,在第十秒的時候直接儲存操作,背景也還是bgsave進行儲存

如果在十秒内變化了一次,那麼redis會在變化第二次的時候進行背景儲存操作,第二個周期會在第一次儲存的時候開始計時

注意:save配置要根據實際業務情況進行設定,頻度過高或者過低都會出現性能問題,結果可能是災難性的,save配置啟動後執行的是bgsave操作

Redis 基礎知識介紹

RDB特殊啟動形式

伺服器運作過程中重新開機

關閉伺服器時指定儲存資料

RDB優點

RDB是一個緊湊壓縮的二進制檔案,存儲效率較高

RDB内部存儲的是redis在某個時間點的資料快照,非常适合用于資料備份,全量複制等場景

RDB恢複資料的速度要比AOF快很多

應用:伺服器中每X小時會執行bgsave備份,并将RDB檔案拷貝到遠端機器中,用于災難恢複

RDB缺點

RDB方式無論是執行指令還是利用配置,無法做到實時持久化,具有較大的可能性丢失資料

bgsave指令每次運作要執行fork操作建立子程序,要犧牲一些性能

redis的衆多版本中未進行RDB檔案格式的版本統一,有可能出現版本伺服器之間資料格式無法相容的現象--解決方案就是 導出來存到word或者Excel中,再導入回去即可。

RDB存儲的弊端

存儲資料量較大,效率較低,基于快照思想,每次讀寫都是全部資料,當資料量巨大時,效率非常低

大資料量下的IO性能較低

基于fork建立子程序,記憶體産生額外消耗

當機帶來的資料丢失風險

解決思路:

不寫全資料,僅僅記錄部分資料

降低區分資料是否改變的難度,改記錄資料為記錄操作過程

對所有操作均進行記錄,排除丢失資料的風險

AOF持久化:以獨立日志的方式記錄每次寫指令,重新開機時再重新執行AOF檔案中指令達到恢複資料的目的。與RDB相比可以簡單了解為由記錄資料改為記錄資料變化

AOF的主要作用就是解決了資料持久化的實時性,目前已經是redis持久化的主流方式

Redis 基礎知識介紹
Redis 基礎知識介紹
Redis 基礎知識介紹
Redis 基礎知識介紹

重寫指令

存入元素後進行重寫

自動重寫

Redis 基礎知識介紹
Redis 基礎知識介紹
Redis 基礎知識介紹
Redis 基礎知識介紹
Redis 基礎知識介紹

建立一個定時器,當key設定有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的删除操作

優點:節約記憶體,到時就删除,快速釋放掉不必要的記憶體占用

缺點:CPU壓力很大,無論CPU此時負載量多高,均占用CPU,會影響redis伺服器響應時間和指令吞吐量

總結:用處理器性能換取存儲空間(拿時間換空間)

資料到達過期時間,不做處理。等下次通路該資料時,我們需要判斷

如果未過期,傳回資料

發現已過期,删除,傳回不存在

優點:節約CPU性能,發現必須删除的時候才删除

缺點:記憶體壓力很大,出現長期占用記憶體的資料

總結:用存儲空間換取處理器性能(拿空間換時間)

定時删除和惰性删除這兩種方案都是走的極端,那有沒有折中方案?

我們來講redis的定期删除方案:

Redis啟動伺服器初始化時,讀取配置server.hz的值,預設為10

每秒鐘執行server.hz次serverCron()-------->databasesCron()--------->activeExpireCycle()

activeExpireCycle()對每個expires[*]逐一進行檢測,每次執行耗時:250ms/server.hz

對某個expires[*]檢測時,随機挑選W個key檢測

參數current_db用于記錄activeExpireCycle() 進入哪個expires[*] 執行

如果activeExpireCycle()執行時間到期,下次從current_db繼續向下執行

Redis 基礎知識介紹

總的來說:定期删除就是周期性輪詢redis庫中的時效性資料,采用随機抽取的政策,利用過期資料占比的方式控制删除頻度

特點1:CPU性能占用設定有峰值,檢測頻度可自定義設定

特點2:記憶體壓力不是很大,長期占用記憶體的冷資料會被持續清理

總結:周期性抽查存儲空間(随機抽查,重點抽查)

Redis 基礎知識介紹

什麼叫資料淘汰政策?什麼樣的應用場景需要用到資料淘汰政策?

當新資料進入redis時,如果記憶體不足怎麼辦?在執行每一個指令前,會調用freeMemoryIfNeeded()檢測記憶體是否充足。如果記憶體不滿足新 加入資料的最低存儲要求,redis要臨時删除一些資料為目前指令清理存儲空間。清理資料的政策稱為逐出算法。

注意:逐出資料的過程不是100%能夠清理出足夠的可使用的記憶體空間,如果不成功則反複執行。當對所有資料嘗試完畢, 如不能達到記憶體清理的要求,将出現錯誤資訊如下

繼續閱讀