淺談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類型其實也可以用來存儲數字,並支援對數字的加減操作。
二、List類型
Redis能夠將數據存儲成一個鏈表,並能對這個鏈表進行豐富的操作
Redis也支持很多修改操作
三、集合(Sets)類型
Redis能夠將一系列不重複的值存儲成一個集合
Sets結構也支援相應的修改操作
四、有序集合(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資料庫的四大家族