Redis - 走進分佈式緩存的世界

Redis - 走進分佈式緩存的世界

1.什麼是NoSQL?

 在我們瞭解Redis之前,我們有一個不得不講的概念,那就是NoSQLNoSQL指的是非關係型的數據庫。是不同於傳統的關係數據庫的數據庫管理系統的統稱。其兩者最重要的區別是NoSQL不使用SQL作爲查詢語言。 NoSQL數據存儲可以不需要固定的表格模式並且是基於鍵值對的,可以想象成表中的主鍵和值的對應關係[KEY|VALUE]。我們這裏可看下非關係型數據庫與關係型數據庫主要有哪些區別。

區別 NoSQL(非關係型數據庫) RDBMS(關係型數據)
存儲方式 主要存儲在內存中,可配置持久化策略 主要存儲在磁盤中
數據結構 半結構化數據,數據結構較簡單,沒有聲明性查詢語言,查詢功能有限 高度組織化結構化數據 ,結構化查詢語言(SQL),支持複雜計算
特性 高性能、高可用性、可伸縮性 數據完整性、事務能力、安全性、可靠性高

 通過上面簡單的幾點對比,我們大概可以知道NoSQL的優點就是擴展性高、使用成本低並且靈活、沒有複雜的關係,但很多時候優點也是缺點,NoSQLRDBMS的同時存在很好的說明了同類事物在不同使用場景下不同的設計理念,沒有標準化、優先的查詢能力、數據的安全性完整性較差等也都是NoSQL的缺點。

2.什麼是Redis?

Redis官網
Redis是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持豐富的數據結構,如字符串(strings)、散列(hash)、 列表(lists)、 集合(sets)、 有序集合(sorted sets)等。它還支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。發展到目前Redis遠遠不是一個簡單的緩存,它還支持主從模式、讀寫分離、集羣模式等豐富強大的功能。

3.Redis與其他NoSQL的區別

 關係型數據庫我們大家接觸的都比較多,主要是MysqlOracle。那麼非關係型數據庫其實選擇性也很多,使用的比較多的主要是:RedisMemcachedMongodbGuava(loadingCache)。這裏我們來看一張比對圖。
在這裏插入圖片描述
 從圖中我們可以看出在早期的時候Redis的搜索量和關注度十分少,但是隨着時間推移Redis的勢頭卻很兇猛,在最近幾年也是達到了一個巔峯,在很多使用緩存的場景下Redis也基本成爲了主要選擇。那麼它的強勢崛起並不是毫無道理的,我們這裏選擇Memcached來和Redis做一個對比來看看Redis是如何在衆多緩存技術中脫穎而出的。

 作爲同款功能的內存緩存產品,我們來分析下RedisMemcached各自的優勢。
 a.首先我們來看看內存管理機制上的差異:

  1. Memcached默認使用Slab Allocation機制來管理內存,主要設計思路是按照預先規定的大小, 將分配的內存分割成特定長度的塊來存儲數據,達到完全解決內存碎片問題的目的。
    在這裏插入圖片描述
    在這裏插入圖片描述
  2. Redis則是採用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,由於CPU內存是連續的,故會在一定程度上存在內存碎片。
    在這裏插入圖片描述

 b.內存管理機制瞭解後我們再來看看數據持久化方案:

  1. Memcached本身不支持內存數據的持久化,所有數據都以in-memory形式存儲在內存當中。
  2. Redis本身支持數據的持久化。提供了兩種不同的持久化方法將數據持久化到磁盤當中(RDBAOF)。

 c.既然主要作爲緩存使用,那數據時效性是一大特點,我們對比一下各自的緩存數據過期策略方案:

  1. Memcached在刪除失效數據時採用的是消極方法,即 Memcached 內部不會主動監視數據是否失效,而是在Get數據時纔會檢查其是否已經失效。
  2. Redis提供定時刪除、定期刪除、惰性刪除多種緩存失效策略以及LRU等算法,減少內存泄漏。

 d.最後我們看下主體也就是數據本身,數據類型

  1. Memcached僅支持單一數據類型,[KEY,VALUE]。
  2. Redis支持豐富的數據類型(String、Hash、List、Set、SortedSet)。

 經過這一系列的瞭解分析,對於Redis的強勢崛起想必大家也不足爲奇了。

4.Redis自身優缺點以及使用場景

 通過之前的瞭解,我們對Redis應該都有了一個基本的認識,除此之外我們可以很簡單地總結一下Redis的優缺點。
優點·:不存在Scheme約束,數據結構相對容易但數據類型豐富,抗壓能力強,性能極高(宣稱10萬/qps).
缺點:不存在索引、外鍵,數據類型不是十分完整,多條件查詢需要通過集合內聯(sinter,zinterstore) 和連接間接實現開發效率低,可維護性不佳。
 上面我們對比了非關係型數據庫與關係型數據庫的區別,這裏我們更詳細來對比下具體的產品之間的區別。

Mysql Memcached Redis
數據庫類型 硬盤持久化 內存緩存 內存緩存+硬盤持久化
數據存儲方式 庫表類型存儲 單一Key/Value類型存儲 多種類型存儲(字符串、列表、散列、集合、有序集合)
特性 支持ACID、主從複製 高性能多線程 持久化、動態擴容、腳本執行、發佈訂閱、主從複製

 在目前開發大環境下,Redis發展十分迅速,在很多場景的選擇下也處於一個優先選擇。
 通過對Redis種種特性的瞭解,我們應該大致可以知道它的使用場景。使用緩存的一個主要目的就是減輕應用服務器的壓力,減少對數據庫的訪問以及對磁盤文件IO的讀取,從而實現一個高性能高可用高拓展的應用程序。
 這裏我們可以舉幾個實際開發中的例子:

  1. 排行榜,這個功能想必大家都接觸過,各種用戶積分排行榜、活動積分排行榜、熱度排行榜,其實都是可以通過Redis去實現的。
  2. 搶紅包,這個功能在國內的大環境下應該不存在沒接觸過的同學,從微信、支付寶推出搶紅包起就一直圍繞着我們的生活,搶紅包的實現與Redis也有着密不可分的關係。
  3. 秒殺,對於秒殺這個功能相信大家也不陌生,每逢雙11、618以及各種平時的準點搶購都可能是使用我們的Redis去實現的。

 除了上面這些,還有各種各樣的場景都使用了我們的Redis作爲緩存或者中間件等其他功能。當然複雜的業務場景並不是只使用到了Redis,例如上面的秒殺功能,真實的場景中可能還使用到了消息隊列等其他的技術,技術都是基於現實場景才能體現它的價值,但是由此可以看出Redis在當下的開發技術棧中佔據着十分重要的地位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章