上一篇文章: Pyhton--Redis實戰:Mac brew安裝redis
下一篇文章: Python--Redis實戰:第一章:初識Redis:第二節:Redis數據結構簡介
Redis是一個遠程內存數據庫,它不只性能強勁,並且還具備複製特性以及爲解決問題而生的獨一無二的數據模型,是一個速度很是快的非關係數據庫(no-relational database)。redis
Redis提供了5種不一樣類型的數據結構,它能夠存儲鍵(key)與5種不一樣類型的值(value)之間的映射(mapping),各式各樣的問題均可以很天然地映射到這些數據結構上:Redis的數據結構致力於幫助用戶解決問題,而不會像其餘數據庫那樣,要求用戶扭曲問題來適應數據庫。除此以外,經過複製、持久化(persistence)和客戶端分片(client-side sharding)等特性,用戶能夠很方便地將Redis擴展成一個可以包含數百GB數據、每秒處理上百萬此請求的系統。數據庫
持久化:將存儲在內存的鍵值對數據持久化帶硬盤。
若是你熟悉關係數據庫,那麼你確定寫過用來關聯兩個表的數據的SQL查詢。而Redis則屬於人民常說的NoSQL數據庫或者非關係數據庫:Redis不使用表,它的數據庫也不會預約義或者強制要求用戶對Redis存儲的不一樣數據進行關聯。segmentfault
高性能鍵值對緩存服務器memcached也常常被拿來於Redis進行比較:這二者均可以用於存儲鍵值映射,彼此的性能也相差無幾,可是Redis可以自動以兩種不一樣的方式將數據寫入硬盤,而且Redis除了能存儲普通的字符串鍵以外,還能夠存儲其它4種數據結構,而memcached只能存儲普通的字符串。這些不一樣之處使得Redis能夠用於解決更爲普遍的問題,而且便可以用於主數據庫(primary database)使用,又能夠做爲其餘存儲系統的輔助數據庫(auxiliar database)來使用。緩存
通常來講,用戶只會在Redis的性能或者功能是必要的狀況下,纔會將數據存儲到Redis中。若是程序對性能要求不高,又或者由於費用緣由而沒有辦法將大量數據庫存儲到內存中,那麼用戶能夠選擇使用關係數據庫,或者其餘非關係數據庫。服務器
下表展現了一部分功能上與Redis有重疊的數據庫服務器和緩存服務器。從這個表能夠看出Redis與這些數據庫及軟件之間的區別。數據結構
名稱 | 類型 | 數據存儲選項 | 查詢類型 | 附加功能 |
---|---|---|---|---|
Redis | 使用內存存儲(in-memory)的非關係數據庫 | 字符串、列表、集合、散列表、有序集合 | 每種數據類型都有本身的專屬命令,另外還有批量操做(bulk operation)和不徹底(partial)的事務支持。 | 發佈與訂閱,主從複製(master/slave replication),持久化,腳本(存儲過程,stored procedure) |
memcached | 使用內存存儲的鍵值緩存 | 鍵值之間的映射 | 建立命令、讀取命令、更新命令、刪除命令以及其餘幾個命令。 | 爲提高性能而設的多線程服務器。 |
MySQL | 關係數據庫 | 每一個數據庫能夠包含多個表,每一個表包含多個行,能夠處理多個表的視圖(view)、支持空間(spatial)和第三方擴展 | SELECT、INSERT、UPDATE、DELETE、函數、存儲過程。 | 支持ACID性質(須要使用InnoDB)。主從複製和主主複製(master/master replication) |
PostgreSQL | 關係數據庫 | 每一個數據庫能夠包含多個表,每一個表能夠包含多個行;能夠處理多個表的視圖;支持空間和第三方擴展;支持可定製類型。 | SELECT、INSERT、UPDATE、DELETE、內置函數、自定義的存儲過程。 | 支持ACID性質。主從複製,由第三方支持的多主複製(multi-master replication) |
MongoDB | 使用硬盤存儲(on-disk)的非關係文檔存儲 | 每一個數據庫能夠包含多個表,每一個表能夠包含多個無schema(schema-less)的BSON文檔 | 建立命令、讀取命令、更新命令、刪除命令、條件查詢命令等。 | 支持map-reduce操做,主從複製。分片。控件索引(spatial index) |
在使用相似Redis這樣的內存數據庫時,一個首先要考慮的問題就是【當服務器關閉時,服務器存儲的數據將何去何從呢?】多線程
Redis擁有兩種不一樣形式的持久化方法,他們均可以用小而緊湊的格式將存儲在內存中的數據寫入硬盤:app
儘管Redis的性能很好,但受限於Redis的內存存儲設計,有時候只使用一臺Redis服務器可能沒有辦法處理全部請求,所以,爲了擴展Redis的讀性能,併爲Redis提供故障轉移(failover)支持,Redis實現了主從複製特性:less
有memcached使用經驗的讀者可能知道,用戶只能用APPEND命令將數據添加到已有字符串的末尾。memcached的文檔中聲明,能夠用APPEND命令來管理元素列表。這很好,用戶能夠將元素追加到一個字符串的末尾,並將那個字符串當作列表來使用。但隨後如何刪除這些元素呢?memcached採用的方法是經過黑名單(blacklist)來隱藏列表裏面的元素,從而避免對元素執行讀寫、更新、寫入(包括在一次數據庫查詢以後執行的memcached寫入)等操做。相反的,Redis的LIST和SET容許用戶添加或則刪除元素。dom
使用Redis而不是 memcached來解決問題,不只可讓代碼變得更簡短、更易懂、更易維護,並且還可使代碼的容許速度更快(由於用戶不須要經過讀取數據庫來更新數據)。除此以外,在其餘不少狀況下,Redis的效率和易用性也比關係數據庫要好的多。
數據庫的一個常見用法是存儲長期的報告數據,並將這些報告數據用做固定時間範圍內的聚合數據(aggregates)。收集聚合數據的常見作法是:
之因此使用插入行的方式來存儲,是由於對於大部分數據庫來講,出入行操做的執行速度很是快(插入行只會在硬盤文件末尾進行寫入)。不過,對錶裏面的行進行更新倒是一個很是慢的操做,由於這種更新除了會引發一次隨機讀(random read)以外,還可能會引發一次隨機寫(random write)。而Redis裏面,用戶能夠直接使用原子的(atomic)INCR命令及其變種來計算聚合數據,而且由於Redis將數據存儲在內存裏面,並且發送給Redis的命令請求並不須要通過典型的查詢分析器(parser)或者查詢優化器(optimizer)進行處理,全部對Redis存儲的數據執行隨機寫的速度老是很是迅速的。
使用Redis而不是關係數據庫或則其餘硬盤存儲數據庫,能夠避免寫入沒必要要的臨時數據,也免去了對臨時數據進行掃描或則刪除的麻煩,並最終改善程序的性能。
【工具會極大地改變人們解決問題的方式】
上一篇文章: Pyhton--Redis實戰:Mac brew安裝redis
下一篇文章: Python--Redis實戰:第一章:初識Redis:第二節:Redis數據結構簡介