第215期 / September 5, 2015

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

淺談NoSQL資料庫-Redis

作者/黃俊曉

[發表日期:2015/8/24]

前言

隨著網際網路的發展,我們把一台一台伺服器變成多台伺服器。當開始建立資料備份時,需要加一個緩衝層來調整所有的查詢,投入更多硬體。最後,需要將資料切分多個集群上,並重構大量的應用邏輯以適應這種切分。不久之後,你就會發現被自己數月前的設計資料結構限制住了。

隨著web2.0的興起,關聯式資料庫本身無法克服的缺陷越來越明顯,主要表現為如下幾點:
1.對資料高併發讀寫的需求
2.對海量資料的高效率存儲和訪問的需求。
3.對資料庫的高可擴展性和高可用性的需求。
4.資料庫事務一致性需求。
5.資料庫寫實性和讀寫時性需求。
6.對複雜SQL的查詢,特別是對關聯查詢的需求。

NoSQL是Notonly SQL的縮寫,NoSQL不使用SQL作為查詢語言。其資料存儲可以不需要固定的表格模式,也經常避免使用SQL的join操作,一般有水準可擴展性的特徵。

NoSQL又分成四大類:
1.Key-Value,如Redis。
2.Document-Oriented,如MongoDB。
3.Wide Column Store,如Cassandra。
4.Graph-Oriented,如Neo4J。
而本篇要介紹的主角則是Key-Value的Redis。

Redis介紹

Redis(Remote Dictionary Server)是一款open source,基於BSD(Berkeley Software Distribution)許可的,高級鍵值(key-value)緩存(cache)和存儲(store) 系統。由於 Redis的鍵包括字串(string)、雜湊(hash)、清單(list)、集合(set)、有序集合(sorted set)、點陣圖(bitmap)和超重對數(hyperloglog),所以常常被稱為資料結構伺服器。你可以在這些類型上面運行原子(atomic)操作,例如,追加字串,增加雜湊中的值,加入一個元素到清單,計算集合的交集、並集和差集,或者是從有序集合中獲取最高排名的元素。

為了滿足高性能,Redis採用記憶體 (in-memory) 資料集 (dataset)。根據你的使用場景,可以通過每隔一段時間轉儲資料集到磁片,或者追加每條命令到日誌來持久化(persistence)。如果只是需要一個功能豐富,網路化的記憶體緩存,持久化也可以被禁用。

Redis還支援主從(master-slave)非同步複製,非常快的非阻塞初次同步、網路斷開時自動重連局部重同步。 其他特性包括:
  • 事務

  • 訂閱/發佈(publish/subscribe)

  • Lua script

  • 帶TTL的鍵

  • LRU回收鍵

  • 自動容錯移轉 (failover)


  • 支援眾多語言:


    Redis優點

    主要有以下幾個方面:
  • 性能極高,能支持超過 100K+ 每秒的讀寫頻率。

  • 豐富的數據類型,Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。

  • 豐富的特性,Redis支持 publish/subscribe, 通知, key 過期等等特性。

  • Redis有著更為複雜的資料結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。Redis的資料類型都是基於基本資料結構的同時對程式師透明,無需進行額外的抽象。

  • Redis運行在記憶體中但是可以持久化到磁片,所以在對不同資料集進行高速讀寫時需要權衡記憶體,應為資料量不能大於硬體記憶體。在記憶體中資料庫方面的另一個優點是, 相比在磁片上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。 同時,在磁片格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。


  • Redis運行環境

    Redis是由 ANSI C語言編寫的,在無需額外依賴下,運行於大多數 POSIX系統,如 Linux、*BSD、OS X。Redis是在Linux和OS X兩款作業系統下開發和充分測試的,因此推薦 Linux 為部署環境。

    Redis也可以運行在Solaris派生系統上,如SmartOS,但是支援有待加強。

    官方沒有支援的Windows構建版本,但是微軟開發和維護了一個64位Windows的版本。或是可使用Microsoft Azure建立一個Redis伺服器。

    Redis操作指令

    在成功架起Redis server後,可以使用Redis官方提供的redis-cli對其進行操作。下面以Redis支援的資料結構,對操作的指令做個簡單的解說。

    一、String類型

    Redis能存儲二進制安全的字串,最大長度為1GB


    String類型其實也可以用來存儲數字,並支援對數字的加減操作。


    String類型還支援對其部分的修改和獲取操作


    二、List類型

    Redis能夠將數據存儲成一個鏈表,並能對這個鏈表進行豐富的操作


    Redis也支持很多修改操作


    三、集合(Sets)類型
      
    Redis能夠將一系列不重複的值存儲成一個集合


    Sets結構也支援相應的修改操作


    Redis還支援對集合的子交並補等操作


    四、有序集合(Sorted Sets)類型

    Sorted Sets和Sets結構相似,不同的是存在Sorted Sets中的數據會有一個score屬性,並會在寫入時就按這個score排好序。


    五、Hash類型
      
    Redis能夠存儲key對多個屬性的數據(比如user1.uname user1.passwd)


    Hash數據結構能夠批量修改和獲取


    六、Redis支持這樣一種特性,你可以將數據推到某個信息管道中,然後其它人可以通過訂閱這些管道來獲取推送過來的信息。

    1.訂閱信息管道:用一個客戶端訂閱管道


    另一個客戶端往這個管道推送信息


    然後第一個客戶端就能獲取到推送的信息


    2.按一定模式批量訂閱:用下面的命令訂閱所有channel開頭的信息通道


    在另一個客戶端對兩個推送信息


    然後在第一個客戶端就能收到推送的信息


    七、數據過期設置

    Redis支持按key設置過期時間,過期後值將被刪除(在客戶端看來是補刪除了的)
    用TTL命令可以獲取某個key值的過期時間(-1表示永不過期)


    下面命令先用EXISTS命令查看key值是否存在,然後設置了5秒的過期時間


    5秒後再查看


    這個值已經沒有了。
    上在是直接設置多少秒後過期,你也可以設置在某個時間點過期,下面例子是設置2011-09-24 00:40:00過期。


    八、事務性

    Redis本身支持一些簡單的組合型的命令,比如以NX結尾命令都是判斷在這個值沒有時才進行某個命令。


    當然,Redis還支持自定義的命令組合,通過MULTI和EXEC,將幾個命令組合起來執行


    你還可以用DICARD命令來中斷執行中的命令序列


    結語

    在現在這個網路發達、資訊交流快速、社群網路百家爭鳴的時代,大數據儼然已成為一股銳不可擋的趨勢。因此認識與學習NoSQL資料庫勢必對資訊相關從業人員有所助益,而Redis又是近年來最火紅的NoSQL資料庫之一,值得我們去了解。

    參考文獻

  • Redis官網

  • Try Redis

  • Redis中文介紹

  • 數據庫Redis系統性介紹

  • 記憶體中資料庫實踐之深入淺出Redis - Redis介紹

  • 解讀NoSQL資料庫的四大家族
  •