摘要:上一篇文章實戰(zhàn)安裝下一篇文章實戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結構簡介是一個遠程內存數(shù)據(jù)庫,它不僅性能強勁,而且還具有復制特性以及為解決問題而生的獨一無二的數(shù)據(jù)模型,是一個速度非常快的非關系數(shù)據(jù)庫。
上一篇文章:Pyhton--Redis實戰(zhàn):Mac brew安裝redis
下一篇文章:Python--Redis實戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結構簡介
Redis是一個遠程內存數(shù)據(jù)庫,它不僅性能強勁,而且還具有復制特性以及為解決問題而生的獨一無二的數(shù)據(jù)模型,是一個速度非??斓姆顷P系數(shù)據(jù)庫(no-relational database)。
Redis提供了5種不同類型的數(shù)據(jù)結構,它可以存儲鍵(key)與5種不同類型的值(value)之間的映射(mapping),各式各樣的問題都可以很自然地映射到這些數(shù)據(jù)結構上:Redis的數(shù)據(jù)結構致力于幫助用戶解決問題,而不會像其他數(shù)據(jù)庫那樣,要求用戶扭曲問題來適應數(shù)據(jù)庫。除此之外,通過復制、持久化(persistence)和客戶端分片(client-side sharding)等特性,用戶可以很方便地將Redis擴展成一個能夠包含數(shù)百GB數(shù)據(jù)、每秒處理上百萬此請求的系統(tǒng)。
持久化:將存儲在內存的鍵值對數(shù)據(jù)持久化帶硬盤。Redis與其它數(shù)據(jù)庫和軟件的對比
如果你熟悉關系數(shù)據(jù)庫,那么你肯定寫過用來關聯(lián)兩個表的數(shù)據(jù)的SQL查詢。而Redis則屬于人民常說的NoSQL數(shù)據(jù)庫或者非關系數(shù)據(jù)庫:Redis不使用表,它的數(shù)據(jù)庫也不會預定義或者強制要求用戶對Redis存儲的不同數(shù)據(jù)進行關聯(lián)。
高性能鍵值對緩存服務器memcached也經常被拿來于Redis進行比較:這兩者都可以用于存儲鍵值映射,彼此的性能也相差無幾,但是Redis能夠自動以兩種不同的方式將數(shù)據(jù)寫入硬盤,并且Redis除了能存儲普通的字符串鍵之外,還可以存儲其它4種數(shù)據(jù)結構,而memcached只能存儲普通的字符串。這些不同之處使得Redis可以用于解決更為廣泛的問題,并且即可以用于主數(shù)據(jù)庫(primary database)使用,又可以作為其他存儲系統(tǒng)的輔助數(shù)據(jù)庫(auxiliar database)來使用。
一般來說,用戶只會在Redis的性能或者功能是必要的情況下,才會將數(shù)據(jù)存儲到Redis中。如果程序對性能要求不高,又或者因為費用原因而沒有辦法將大量數(shù)據(jù)庫存儲到內存中,那么用戶可以選擇使用關系數(shù)據(jù)庫,或者其他非關系數(shù)據(jù)庫。
下表展示了一部分功能上與Redis有重疊的數(shù)據(jù)庫服務器和緩存服務器。從這個表可以看出Redis與這些數(shù)據(jù)庫及軟件之間的區(qū)別。
名稱 | 類型 | 數(shù)據(jù)存儲選項 | 查詢類型 | 附加功能 |
---|---|---|---|---|
Redis | 使用內存存儲(in-memory)的非關系數(shù)據(jù)庫 | 字符串、列表、集合、散列表、有序集合 | 每種數(shù)據(jù)類型都有自己的專屬命令,另外還有批量操作(bulk operation)和不完全(partial)的事務支持。 | 發(fā)布與訂閱,主從復制(master/slave replication),持久化,腳本(存儲過程,stored procedure) |
memcached | 使用內存存儲的鍵值緩存 | 鍵值之間的映射 | 創(chuàng)建命令、讀取命令、更新命令、刪除命令以及其他幾個命令。 | 為提升性能而設的多線程服務器。 |
MySQL | 關系數(shù)據(jù)庫 | 每個數(shù)據(jù)庫可以包含多個表,每個表包含多個行,可以處理多個表的視圖(view)、支持空間(spatial)和第三方擴展 | SELECT、INSERT、UPDATE、DELETE、函數(shù)、存儲過程。 | 支持ACID性質(需要使用InnoDB)。主從復制和主主復制(master/master replication) |
PostgreSQL | 關系數(shù)據(jù)庫 | 每個數(shù)據(jù)庫可以包含多個表,每個表可以包含多個行;可以處理多個表的視圖;支持空間和第三方擴展;支持可定制類型。 | SELECT、INSERT、UPDATE、DELETE、內置函數(shù)、自定義的存儲過程。 | 支持ACID性質。主從復制,由第三方支持的多主復制(multi-master replication) |
MongoDB | 使用硬盤存儲(on-disk)的非關系文檔存儲 | 每個數(shù)據(jù)庫可以包含多個表,每個表可以包含多個無schema(schema-less)的BSON文檔 | 創(chuàng)建命令、讀取命令、更新命令、刪除命令、條件查詢命令等。 | 支持map-reduce操作,主從復制。分片。控件索引(spatial index) |
在使用類似Redis這樣的內存數(shù)據(jù)庫時,一個首先要考慮的問題就是【當服務器關閉時,服務器存儲的數(shù)據(jù)將何去何從呢?】
Redis擁有兩種不同形式的持久化方法,他們都可以用小而緊湊的格式將存儲在內存中的數(shù)據(jù)寫入硬盤:
第一種持久化方法為:時間點轉儲(point-in-time dump)。轉儲操作既可以在【指定時間段內有指定數(shù)量的寫操作執(zhí)行】這一條件被滿足時執(zhí)行,又可以通過調用兩條轉儲的硬盤(dump-to-disk)命令中的任何一條來執(zhí)行。
第二種持久化方法為:將所有修改了數(shù)據(jù)庫的命令都寫入一個只追加(append-only)文件里面,用戶可以根據(jù)數(shù)據(jù)的重要程度,將只追加寫入設置為:從不同步、每秒同步一次、寫入一個命令就同步一次。
盡管Redis的性能很好,但受限于Redis的內存存儲設計,有時候只使用一臺Redis服務器可能沒有辦法處理所有請求,因此,為了擴展Redis的讀性能,并為Redis提供故障轉移(failover)支持,Redis實現(xiàn)了主從復制特性:
執(zhí)行復制的從服務器會連接上主服務器,接受主服務器發(fā)送的整個數(shù)據(jù)庫的初始副本(copy);
之后主服務器執(zhí)行的寫命令,都會被發(fā)送給所有連接著的【從服務器】去執(zhí)行,從而實時的更新從服務器的數(shù)據(jù)集。
因為【從服務器】包含的數(shù)據(jù)會不斷的更新,所以客戶端可以向任意一個從服務器發(fā)送【讀請求】,以此來避免對主服務器進行集中式訪問。
使用Redis的理由有memcached使用經驗的讀者可能知道,用戶只能用APPEND命令將數(shù)據(jù)添加到已有字符串的末尾。memcached的文檔中聲明,可以用APPEND命令來管理元素列表。這很好,用戶可以將元素追加到一個字符串的末尾,并將那個字符串當做列表來使用。但隨后如何刪除這些元素呢?memcached采用的方法是通過黑名單(blacklist)來隱藏列表里面的元素,從而避免對元素執(zhí)行讀寫、更新、寫入(包括在一次數(shù)據(jù)庫查詢之后執(zhí)行的memcached寫入)等操作。相反的,Redis的LIST和SET允許用戶添加或則刪除元素。
使用Redis而不是 memcached來解決問題,不僅可以讓代碼變得更簡短、更易懂、更易維護,而且還可以使代碼的允許速度更快(因為用戶不需要通過讀取數(shù)據(jù)庫來更新數(shù)據(jù))。除此之外,在其他很多情況下,Redis的效率和易用性也比關系數(shù)據(jù)庫要好的多。
數(shù)據(jù)庫的一個常見用法是存儲長期的報告數(shù)據(jù),并將這些報告數(shù)據(jù)用作固定時間范圍內的聚合數(shù)據(jù)(aggregates)。收集聚合數(shù)據(jù)的常見做法是:
先將各個行插入一個報告表里面
之后再通過掃描這些行來收集聚合數(shù)據(jù)
再根據(jù)收集到的聚合數(shù)據(jù)來更新聚合表中已有的那些行。
之所以使用插入行的方式來存儲,是因為對于大部分數(shù)據(jù)庫來說,出入行操作的執(zhí)行速度非??欤ú迦胄兄粫谟脖P文件末尾進行寫入)。不過,對表里面的行進行更新卻是一個非常慢的操作,因為這種更新除了會引起一次隨機讀(random read)之外,還可能會引起一次隨機寫(random write)。而Redis里面,用戶可以直接使用原子的(atomic)INCR命令及其變種來計算聚合數(shù)據(jù),并且因為Redis將數(shù)據(jù)存儲在內存里面,而且發(fā)送給Redis的命令請求并不需要經過典型的查詢分析器(parser)或者查詢優(yōu)化器(optimizer)進行處理,所有對Redis存儲的數(shù)據(jù)執(zhí)行隨機寫的速度總是非常迅速的。
使用Redis而不是關系數(shù)據(jù)庫或則其他硬盤存儲數(shù)據(jù)庫,可以避免寫入不必要的臨時數(shù)據(jù),也免去了對臨時數(shù)據(jù)進行掃描或則刪除的麻煩,并最終改善程序的性能。
【工具會極大地改變人們解決問題的方式】
上一篇文章:Pyhton--Redis實戰(zhàn):Mac brew安裝redis
下一篇文章:Python--Redis實戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結構簡介
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/42518.html
摘要:上一篇文章實戰(zhàn)第一章初識第一節(jié)簡介下一篇文章實戰(zhàn)第一章初識第三節(jié)你好文章投票試煉可以存儲鍵與種不同的數(shù)據(jù)結構類型之間的映射,這中數(shù)據(jù)結構類別分別是字符串列表集合散列和有序集合。 上一篇文章:Python--Redis實戰(zhàn):第一章:初識Redis:第一節(jié):Redis簡介下一篇文章:Python--Redis實戰(zhàn):第一章:初識Redis:第三節(jié):你好Redis-文章投票試煉 Redis可...
摘要:為了防止用戶對同一篇文章進行多次投票,網站需要為每一篇文章記錄一個已投票用戶名單。上一篇文章實戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結構簡介下一篇文章實戰(zhàn)第二章使用構建應用第一節(jié)登錄和緩存 上一篇文章: Python--Redis實戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結構簡介下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第一節(jié):登錄和cookie緩存 ...
閱讀 1505·2019-08-29 17:14
閱讀 1674·2019-08-29 12:12
閱讀 757·2019-08-29 11:33
閱讀 3293·2019-08-28 18:27
閱讀 1470·2019-08-26 10:19
閱讀 929·2019-08-23 18:18
閱讀 3558·2019-08-23 16:15
閱讀 2577·2019-08-23 14:14