初學Redis(1)——認識Redis,初學redis認識
Redis官網對Redis的定義是:“Redis is an open source, BSD licensed, advanced key-value cache and store”,可以看出,Redis是一種鍵值系統,可以用來緩衝或儲存資料。Redis是“Remote Dictionary Server”(遠程字典服務)的縮寫,提供了字串(string),列表(list),雜湊(hash),集合(set)和有序集合(sorted set)等5種資料結構,這些資料結構使它成為一種便於使用的鍵值系統。
作為Redis提供的最簡單的資料結構,字串及其常用命令如所示:
圖1
可見,Redis字串類型實際上類似於C++中的map,一個鍵對應一個值。清單類型則是一種相對進階的資料結構,其和常用命令如所示:
圖2
列表實際上由一個雙向鏈表實現,所以在列表兩端插入或刪除資料效率極高,可以用於實作類別似於微博、人人網上的“新鮮事”功能。 Redis提供的一個更有趣的結構稱為雜湊,其和常用命令如所示:
圖3
一個雜湊實際上是一組鍵值對的集合,雜湊本身的鍵是“父鍵”,雜湊中包含的若干欄位是“子鍵”,每個“子鍵”都有相應的值。“子鍵”之間並沒有一定的聯絡,但是它們共同組成了一個完整的雜湊結構。我們可以把一個雜湊看做關聯式資料庫中的一行,雜湊的每個子鍵對應行的一個欄位。因此,當把關聯式資料庫中的資料緩衝至Redis時,使用雜湊結構可能會帶來方便。需要注意的是,雜湊結構內部的子鍵之間是沒有循序關聯性的。Redis提供的另一個無循序關聯性的結構是集合,其和常用命令如所示:
圖4
集合中的資料滿足唯一性和無序性。集合在Redis內部是用雜湊表實現的,所以插入和刪除操作的時間複雜度均為O(1)。Redis為集合提供了求交並差等運算命令,使用起來非常方便。與集合密切相關的另一個資料結構是有序集合,其和常用命令如所示:
圖5
有序集合與集合的最大差異在於有序集合中的每個資料都有一個對應的分數,集合中的元素就是按照這些分數進行排序的。從結構功能和使用方法上來看,有序集合可能是Redis提供的5種資料結構中最進階的一種。
Redis是一種記憶體資料庫,這使其在資料存取效率方面表現突出。由於記憶體中的資料時刻面臨丟失的危險,Redis提供了兩種持久化機制,及時將記憶體中的資料寫入硬碟。第一種機製為RDB,利用儲存快照的方式把記憶體資料定期寫入硬碟;第二種機製為AOF,利用寫日誌的方式,每執行一條更改Redis資料的命令,就在日誌裡附加上該命令並儲存在硬碟上。Redis預設開啟RDB模式,關閉AOF模式,這是因為AOF更加耗時。但是,如果對資料安全要求極高,無法承擔任何資料丟失的後果,AOF模式就變成了持久化的首選。
當然,即使Redis具備持久化機制,但是一旦本地硬碟損壞,資料丟失依然在所難免。所以,Redis又提供了複製功能,作用是將一個主要資料庫(master)的資料自動同步到多個從資料庫(slave),從而儘可能防止資料丟失。Redis主從機制可以簡單描述為:從資料庫啟動後,先向主要資料庫發送SYNC命令;主要資料庫接到SYNC命令後就開始儲存快照,在此期間,所有發給主要資料庫的命令都被緩衝起來;快照儲存完成後,主要資料庫把快照和緩衝的命令一起發給從資料庫;從資料庫儲存主要資料庫發來的快照檔案,並依次執行主要資料庫發來的緩衝命令。在同步過程中,從資料庫不會阻塞,它預設使用同步之前的資料繼續響應用戶端發來的命令。
事務是Redis提供的特性之一。首先利用MULTI命令通知Redis,接下來的若干命令屬於同一事務;然後輸入若干命令,這些命令都被放入命令隊列而不會被立即執行;最後,利用EXEC命令通知Redis,屬於同一事務的所有命令均已輸入完成,現在開始執行該事物。屬於同一個事務的所有有效命令或者全部被執行,或者全部不執行,且在執行過程中不會插入其他命令。管道(pipeline)是Redis提供的另一個特性。該特性使Redis能夠一次性接收多個命令,執行之後再一次性返回結果。這樣能夠減少用戶端與Redis伺服器的通訊次數,從而降低往返時延。
除事務和管道以外,Redis還提供了很多其他特性,如設定鍵的到期時間,利用BLPOP/BRPOP命令實現優先順序隊列,利用PUBLISH/SUBSCRIBE命令實現訊息訂閱和發布等,這裡不再贅述。
Redis由ANSI C寫成,能夠運行在包括Linux和OS X在內的大部分POSIX系統上,官方推薦的作業系統為Linux。Redis沒有官方的Windows版本,但是微軟移植並維護了一個能夠運行在Windows上的Redis並放在github上(https://github.com/MSOpenTech/redis)。
Redis的編程介面被稱為用戶端(clients),絕大部分主流程式設計語言都有官方推薦的用戶端。中,具有Redis官方推薦用戶端的語言標為綠色,沒有官方推薦用戶端的標為藍色:
圖6
由於Redis沒有官方推薦的C++用戶端,因此可以使用C用戶端予以代替。官方推薦的C用戶端是hiredis,可以從github上找到(https://github.com/redis/hiredis)。
作為一款功能強大,效率極高的NoSQL資料庫,Redis已被包括新浪微博,知乎,Stackoverflow,暴雪和Flickr在內的多家公司成功用於實戰。
註:圖1-5均來自《Redis in Action》,Josiah L.Carlson, Manning Publications, 2013
參考文獻:
1. 李子驊,Redis入門指南,人民郵電出版社,2013年5月第1版
2.Josiah L.Carlson, Redis in Action, Manning Publications, 2013
3. Redis官方網站http://www.redis.io
怎讓外網訪問redis快取服務,現在只可以被127001訪問
試試吧配置裡的 bind 127.0.0.1注釋掉,別忘了重啟redis
Java 開發 20: 現實世界中的 Redis :Redis 怎在包含大量讀取操作的應用程式中戰勝 memcached
此外,我還討論過較為常見的基於伺服器的資料存放區,比如 MongoDB 和 CouchDB。每個資料存放區都有其優勢和劣勢,特別是當應用於特定領域時。 本期的 Java 開發 2.0 關注的是 Redis,一種輕量級索引值對資料存放區。多數 NoSQL 實現本質上都是索引值對,但是 Redis 支援非常豐富的值集,其中包括字串、列表、集以及散列。因此,Redis 通常被稱為資料結構伺服器。Redis 也以異常快速而聞名,這使得它成為某一特定類型使用案例的最優選擇。 當我們想要瞭解一種新事物時,將其同熟知的事物進行比較可能會有所協助,因此,我們將通過對比其與 memcached 的相似性以開啟 Redis 探索之旅。接著我們將介紹 Redis 的主要功能,這些功能可以使其在某些應用情境可以勝過 memcached。最後我將向您展示如何將 Redis 作為一個傳統資料存放區用於模型對象。Redis 和 memcached Memcached 是一個眾所周知的記憶體對象緩衝系統,通過將目標鍵和值匯入記憶體緩衝運行。因此,Memcached 能迴避讀取磁碟時發生的 I/O 成本問題。在 Web 應用程式和資料庫之間粘貼 memcached 時會產生更好的讀取效能。因此,對於那些需要快速資料查詢的應用程式,Memcached 是一個不錯的選擇。其中的一個例子為股票查詢服務,需要另外訪問資料庫擷取相對待用資料,如股票名稱或價格資訊。 MemcacheDB 將Redis 與 memcached 相比較並不公平,它與 MemcacheDB 相比要好的多,MemcacheDB 是一個分布式索引值對儲存系統,專為資料持久化而設計。MemcacheDB 與 Redis 較為相似,其新增優勢可以使其輕鬆地與 memcached 實現的用戶端進行通訊。 但是memcached 也有其局限性,其中一個事實就是它所有的值均是簡單的字串。Redis 作為 memcached 的替代者,支援更加豐富的功能集。一些基準 (benchmarks) 也表明 Redis 的速度要比 memcached 快很多。Redis 提供的豐富資料類型使其可以在記憶體中儲存更為複雜的資料,這是使用 memcached 無法實現的。同 memcached 不一樣,Redis 可以持久化其資料。 Redis 解決了一個重大的緩衝問題,而其豐富的功能集又為其找到了其他用途。由於 Redis 能夠在磁碟上儲存資料以及跨節點複製資料,因而可以作為資料倉儲用於傳統資料模式(也就是說,您可以使用 Redis,就像使用 RDBMS 一樣)。Redis 還經常被用作隊列系統。在本用例中,Redis 是備份和工作隊列持久化儲存(利用 Redis 的清單類型)的基礎。GitHub 是以此種方法使用 Redis 的大規模基礎架構樣本準備好 Redis,立即開始! 要開始使用 Redis,您需要訪問它,可以通過本地安裝或者託管供應商來實現訪問。如果您使用的 MAC,安裝過程可能就不那麼簡單。如果您使用的是 Windows??,您需要先安裝 Cygwin。如果您正在尋找一個託管供應商,Redis4You 擁有一個免費計劃。不管您以何種方式訪問,您都能夠根據本文下列樣本進行操作,但是我需要指出的是,使用一個託管供應商進行緩衝可能並不是很好的緩衝解決方案,因為網路延遲可能會抵消任何效能優勢。 您需要通過命令與 Redis 進行互動,這就是說,這裡沒有 SQL 類查詢語言。使用 Redis 工作非常類似於使用傳統 map 資料結構,即所有的......餘下全文>>